当前位置:首页 > Java入门 > 正文内容

java为什么要用反射机制(java为什么要用抽象类去实现接口)

abcsky887个月前 (10-28)Java入门88

本篇文章给大家谈谈

目录1、static的“由来”2、static的使用场景3、关于static的常见问题4、总结 Java是一种面向对象编程的语言,而对象是客观存在的事物,对同类对象抽象出其共性,便是Java中的类,类是对象的模子,具有相同属性和方法的一组对象的集合。

java为什么要用反射机制(java为什么要用抽象类去实现接口)

有了类的定义,我们就可以用类来描述世上任何东西然而,有一个特殊的东西不属于对象,它就是static1. static的“由来”咱们先来分析一下以下代码:public class Demo { public static void main(String[] args) { //实例化一个p1 网站广告推广 Person p1=new Person(); p1.name="xiaoming";   p1.speak(); //实例化一个p2 Person p2=new Person(); p2.name="xiaohong";   p2.speak(); } } class Person{ String name; //CN是显示初始化值 String country="China"; 网站广告推广 void speak(){ System.out.println("My name is "+name+",my country is "+country); } }

通过分析上面的代码,不难发现p1和p2两个对象中,存在一个相同的属性值country="China"。接下来我们通过内存示意图来观察下:

从上图中我们可以注意到红色框中的内容是重复存在于堆中的倘若对象越建越多,那么堆中的重复数据也会越来越多,这样就会导致内存造成不必要的消耗既然各个对象中都存在同样的数据,那么何不将这些相同的数据单独拿出来并且单独存放呢?现在将Person类中的co网站广告推广untry字段加上static,其他不做改动:。

class Person{ String name; //将数据值相同且共用的用static修饰,成为类变量 static String country="CN";  void speak(){ System.out.println("My name is "+name+",my country is "+country); } }

于是,我们将相同的数据放到静态存储区内,并让静态存储区中的数据共享给所有对象,这样就可以大大减少了不必要的网站广告推广内存损耗,可见static关键字的作用2.static的使用场景在《Java编程思想》有这样一段话:。

“static方法就是没有this的方法在static方法内部不能调用非静态方法,反过来是可以的而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法这实际上正是static方法的主要用途。

” 这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:方便在没有创建对象的情况下来进行调用(方法/变量)下面我们就来探讨一下static的几个使用场景。

1)修饰成员变量和成员方法用static修饰成员变量可以说是该关键字最网站广告推广常用的一个功能,通常将用static修饰的成员变量称为类成员或者静态成员本文就是通过该使用场景抛砖引玉,描述了static关键字的“由来”。

在jvm的内存构造中,会在堆中开辟一块内存空间,专门用来存储用static修饰的成员变量,称为静态存储区,无论我们创建多少个对象,用 static 修饰的成员变量有且只有一份存储在静态存储区中,所以该静态变量的值是以最后创建对象时设置该静态变量的值为准。

并且任何对象都可以对静态存储区中的成员变量做出修改,静态存储区中的成员变量的值以最后一次修改为准值得一提的是,在JDK1.8以前,静态存储区是存放在方法区的,而方法区不属于堆,在JDK1.8之后,方法区中的网站广告推广静态存储区改为到堆中存储。

用static修饰方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this指针的,因为它不依附于任何对象,既然都没有对象,就谈不上this了并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的2)静态代码块静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行,执行顺序为静态代码块—>非静态代码块—>构造方法—>网站广告推广静态方法。

我们来运行以下程序:Public class Main { Static { System.out.println(“静态代码块”); } { System.out.println(“非静态代码块”); } public Main(){ System.out.println(“构造方法”); } public static void eat(){ System.out.println(“静态方法”); 网站广告推广 } public static void main(String[] args) { Main main = new Main(); Main.eat(); } } 运行结果: 静态代码块 非静态代码块 构造方法 静态方法

而在java继承关系中静态代码块、代码块、构造方法的执行顺序为父类静态代码块—>子类静态代码块—>父类代码块—>父类构造—>子类代码块—>子类构造,可以通过下列代码来判断:public class Demo {网站广告推广 public static void main(String[] args) { new H2(); } } //父类H1 class H1{ { System.out.println("父类代码块"); } public H1(){ System.out.println("父类构造"); } static{ System.out.println("父类静态代码块"); 网站广告推广 } } //H2继承H1 class H2 extends H1{ static{ System.out.println("子类静态代码块"); } { System.out.println("子类代码块"); } public H2(){ System.out.println("子类构造"); } } 运行结果: 父类静态代码块 网站广告推广 子类静态代码块 父类代码块 父类构造 子类代码块 子类构造

static关键字可以利用这些特性,通过形成静态代码块来优化程序性能静态代码块可以存在于类的任何一个地方,并且一个类可以有多个静态代码块,在类初次被加载的时候,会按照静态代码块声明的顺序来依此执行,并且只会执行一次。

那么,我们就可以利用静态代码块只加载一次的特性,将不需要重复加载的数据放入静态代码块中来优化程序3)静态内部类内部类指的是定义在一个类的内部的类,包含内部类的类成为外部类,而静态内部类指的是用 static 修饰的内部类。

定义内部类的好处是外部类可以访问内网站广告推广部类的所有方法和属性,包括私有方法和私有属性下面通过代码来理解静态内部类的使用://定义一个普通外部类 public class OutClass { //定义一个普通内部类 public class InnerClass{ } }

这里我们要想访问普通内部类,就必须先创建外部类的对象,然后通过外部类名.new 创建内部类的实例,例如第一步:OuterClass oc = new OuterClass();第二步:OuterClass.InnerClass in = oc.new InnerClass();。

显然,这网站广告推广样的做法不是很友好//定义一个普通外部类 public class OutClass { //定义一个静态内部类 public static class InnerClass{ } } 如果将普通内部类改为静态内部类,添加static关键字,我们就不需要创建外部类的对象,而是可以直接通过外部类名.内部类名来创建实例,例如OuterClass.InnerClass sic = new OuterClass.InnerClass();。

这样就会显得简单很多3.关于static的常见问题1)static关网站广告推广键字会改变类中成员的访问权限吗?不会Java中的static关键字不会影响到变量或者方法的作用域在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。

2)静态变量可以存在于普通方法中吗?可以普通方法必须通过对象来调用,静态变量可以直接通过类名来调用,也可以通过对象来调用,所以是可以存在于普通方法中的3)静态方法能存在普通变量吗?不能因为静态方法可以直接通过类名来直接调用,不用创建对象,而普通变量是必须通过对象来调用的。

4)static 可以用来修饰局部变量吗?不能在C/C++中static是可以作用域局部变量的,但是在Java中切记网站广告推广:static是不允许用来修饰局部变量不要问为什么,这是Java语法的规定4.总结总的来说,static关键字主要作用就是方便在没有创建对象的情况下进行调用方法/变量。

当static修饰成员变量和方法时,该变量就成为了所有对象的公共数据,可以直接通过类名来调用而不用创建对象;当static修饰代码块时,该代码块会在类初次被加载的时候被加载,且只会加载一次,这里需要注意加载顺序的问题;当static修饰内部类时,可以使得操作内部类变得想对简单。

另外,根据static的特性,产生了一种重要的设计模式——单例设计模式这里做个简单介绍,程序实例如下:class Singleton{ p网站广告推广rivate static Singleton instance = null; private Singleton(){} public static getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }

单例设计模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于网站广告推广构造对象被声明为private,外界无法直接创建这个类型的对象,这里就可以把创建对象的方法声明为static,通过使用类名来调用方法创建对象,从而完成该模式的设计,有兴趣的读者可以深入

设计模式来学习目前师长号内正在【原创】连载设计模式专题,关于设计模式的文章确实有很多,但师长发现内容雷同比较多,甚至连内容的结构也比较统一单调,连文章的风格也都相去不远设计模式属于技术体系中比较理论的内容,比较枯燥,要是再套用书本上那种正式严肃的风格去写,会比较痛苦。

而区别于网上复制粘贴,漏洞百出,陈旧不堪的水文,师长号内正在原创设计模式专题,力求浅显易懂,每一篇都是认真雕琢,经过实例验证的专注原创高质量技术文输网站广告推广出!设计模式专题:【原创】让设计模式飞一会儿|①开篇获奖感言。

【原创】让设计模式飞一会儿|②单例模式【原创】让设计模式飞一会儿|③工厂模式【原创】让设计模式飞一会儿|④原型模式

扫描二维码推送至手机访问。

版权声明:本文由海南拓宏网络科技工作室发布,如需转载请注明出处。

本文链接:http://4blc.com/post/608.html

分享给朋友:

“java为什么要用反射机制(java为什么要用抽象类去实现接口)” 的相关文章

应届生去培训机构学java之后该怎么找工作呢女生(java培训机构学出来的好找工作)

本文分享给大家的是: 培训机构出来,只是有了从事这个行业的基本工作能力这是要找工作就是两点:基本功+项目基本功这包括三个点:一是包括JAVASE和JAVAEE的这些基础的知识二是web相关的知识也要重点掌握三是项目中使用的技术的原理要熟练掌握,如数据库,权限管理等……。 项...

2021高考试卷全国乙卷(2021高考试卷真题及答案)

本篇文章给大家谈谈 本文将针对java学习为你提供中肯建议,结合java实际的行业现状,帮助你更好的选择适合自己的学习方式,解答学习中可能会出现的疑惑,一步步提升java技术,成为优秀的java程序员~为方便阅读本文会深入浅出,保证大家都能理解具体含义。 本文由 @荀豹原创...

墙面沙化是什么意思啊视频(墙面沙化是质量问题吗)

今天给各位分享 原标题:墙面沙化是什么意思啊?举个简单的例子应该很多人都遇到过类似的情况,尤其是毛坯房,在墙根上总能看见很多的粉末,墙的表面能明显看出比较蓬松,用手一抠就掉下来很多沙子一样的东西,这种现象就是墙面沙化2墙面沙化原因 1、是水泥用量不合理或水泥过期等导致的标号...

java培训班管用吗(java培训班怎么样)

本篇文章给大家谈谈 其实不管是哪个行业都会有人被淘汰,而这些人在IT行业也好,在教育行业也好被淘汰大部分只是因为固步自封,只守着自己的一亩三分地,这注定是要被淘汰的尤其是像IT行业,更新换代是非常快的,而Java 技术也可以说是日新月异,在这种时代背景下,很多岗位被进行细分,这就代...

春卷皮的吃法(脆皮春卷高清图片)

今天给各位分享 脆皮春卷这些美味可口的春卷里装满了切碎的蔬菜、大蒜和生姜,且是使用空气炸锅的无油脂配方传统的油炸春卷,对肝脏负担很重,这对于任何想要疗愈慢性病症的人来说都并不利这道食谱提供了一种享受春卷美味但不会让肝脏负担过重的方法。 洋葱、葱等含有硫(包括植物化学物大蒜素...

小鲜肉指的是什么意思(小鲜肉的本意)

本篇文章给大家谈谈 参考消息网5月3日报道《南华早报》网站近日刊登一篇文章,题目是《中国娱乐圈的漂亮男孩:他们的事业能比俊俏容貌持久吗?》文章开篇称,xiao xian rou,or little fresh meat - mainland internet slang for y...