Static关键字

静态变量

static修饰变量---静态变量/类变量。静态变量在类加载的时候加载到方法区,并且在方法区中被赋予默认值。由于静态变量先于对象出现,所以可以通过类名来调用静态变量,也可以通过对象调用。这个类的所有对象存储的是这个静态变量在方法区的地址,所以所有对象是共享这个静态变量。

 

注意:

1. 类是加载到方法区中---类中的所有的信息都会加载方法区中

2. 类是第一次使用的时候加载到方法区,加载之后不在移除 --- 意味着类只加载一次

 

静态变量能否定义到构造方法中?---不可以。--- 静态变量在类加载的时候加载到方法区;构造方法是在创建对象的时候调用,在栈内存中执行。

静态变量能否定义到构造代码块中?---不可以

注意:所有的静态只能定义在类中不能定义到代码块中,代码块也就意味着这个变量的作用域只是在当前代码块的作用域内。

内部类与加载顺序

内部类中不能含有静态变量

静态变量是要占用内存的,在编译时只要是定义为静态变量了,系统就会自动分配内存给他,而内部类是在宿主类编译完编译的,也就是说,必须有宿主类存在后才能有内部类,这也就和编译时就为静态变量分配内存产生了冲突,因为系统执行:运行宿主类->静态变量内存分配->内部类,而此时内部类的静态变量先于内部类生成,这显然是不可能的,所以不能定义静态变量!

 

静态内部类:

它不像普通的内部类,在外部类加载的时候,静态内部类也不会被加载,因为它和外部类没有什么关系,只有再调用它的时候他才会被加载,所以在单例模式的时候我们可以用这种方法稍微改进一下饿汉式。

类在什么时候被初始化:(在一个类加载器里面,一个类只会被初始化一次)

创建类的实例,也就是new一个对象 

2.访问某个类或接口的静态变量,或者对该静态变量赋值 

调用类的静态方法 

4.反射(Class.forName(“com.lyj.load”)) 

5.初始化一个类的子类(会首先初始化子类的父类) 

6.JVM启动时标明的启动类,即文件名和类名相同的那个类 

java静态方法不能被重写

静态方法可以被继承,但是,不能被覆盖,即重写。如果父类中定义的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏。可以使用语法:父类名.静态方法调用隐藏的静态方法。
如果父类中含有一个静态方法,且在子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写。换句话说,父类和子类中含有的其实是两个没有关系的方法,它们的行为也并不具有多态性
因此,通过一个指向子类对象的父类引用变量来调用父子同名的静态方法时,只会调用父类的静态方法。

posted @ 2019-09-05 21:36  LeeJuly  阅读(118)  评论(0)    收藏  举报