一、static关键字
作用域:static可以修饰 方法,变量,代码块。
作用:
- 支持未创建对象的情况下,直接通过类本身进行调用。
- 节省内存空间,被修饰的部分在内存中只有一个副本。对于多次进行相同内容实例化的部分,可以通过static关键字修饰,从而达到节省内存的效果。
静态方法内部不可以引用非静态方法或者变量。但是在非静态方法中可以访问静态的变量和方法。其原因在于:静态变量或者方法,在类第一次被加载的时候就会被初始化。而非静态变量或者方法需要依赖于类的对象,在创建对象时候被初始化。静态变量和方法只有一个内存副本,所有对象共享的。
二、可以通过静态代码块来优化程序;
每个类的对象在加载时候都会用到的部分,可以用静态代码块来声明。
三、静态方法相关的访问顺序:
以上代码打打印顺序是什么样子的:(static→成员变量→构造器,先父类再子类)
首先寻找main方法,main方法是程序的入口。想使用main方法,必然需要加载main方法所在的类Test。这是Test类的第一次加载,所以会初始化static修改的部分。表现在代码中,则是输出:
test static
加载Test类的时候会按照程序的顺序先执行static修饰部分,所以第二步初始化main方法,执行其中的new MyClass(),而MyClass()未被加载过,所以要先加载这个类。但是加载这个类的时候会发现他继承了父类Test,而父类Test已经被加载过了,所以直接加载MyClass。表现在代码中,则是输出:
myclass static
类加载完成之后,就会通过构造器来生成对象。而在生成对象的时候会首先初始化父类的成员变量。因此会执行Person person = new Person(“Test”)。此时发现Person类未被加载过,所以需要先加载Person类。因为会初始化静态代码块,然后在调用构造器。表现在代码中,则是输出:
person static person Test
父类的成员变量初始化完成以后,就开始执行父类的构造器。表现在代码中,则是输出:
test constructor
就要初始化自身的成员变量,则调用Person person = new Person(“MyClass”),由于Person已经加载过,就直接调用构造器。表现在代码中,则是输出:
person MyClass
最后执行MyClass的构造器。表现在代码中,则是输出:
myclass constructor
虽然在main方法中没有任何语句,但是还是会输出,理由同上。
问题:静态变量 和 常量(final)的区别?
- 静态变量 和 常量 都是类属性,不需要实例化就可以访问,随着类的加载而加载。
- 常量:类的不可变属性
- 静态变量:类的可变属性
问题:同时被static和final修饰的变量可以在声明时候不进行初始化吗?
不可以,因为静态变量在类第一次被加载的时候就会被初始化,final修饰的变量在初始化后值就不可以被修改了。