对象的创建过程以及static和final关键字
- **天使总在想象中,魔鬼总在细节处**
- 一、对象的创建过程
- 二、static关键字
- static关键字可以用于修饰类的成员变量,类的成员方法,以及用于编写static代码块来优化程序性能
- 1、static变量
- 2、static方法
- 3、static代码块
- 4、static关键字的误区
- fianl关键字
- final可以修饰变量,方法,类,甚至方法参数
- 1、final关键字声明的变量,我们称之为常量,必须对该值初始化操作
- 修饰基本数据类型和引用类型
- 2、final关键字声明方法时,该方法为最终方法,且只能被子类继承,不能被子类重写。
- 3、final关键字声明类时,该类为最终类(不可变的类),final修饰的类无法被继承。
- 4、final关键字声明方法参数时,在该方法内部不能修改参数的值。
天使总在想象中,魔鬼总在细节处
一、对象的创建过程
public class Test extends Base{
static{
System.out.println("test static");
}
public Test(){
System.out.println("test constructor");
}
public static void main(String[] args) {
new Test();
}}
class Base{
static{
System.out.println("base static");
}
public Base(){
System.out.println("base constructor");
}
结果:
base static
test static
base constructor
test constructor
说明:
方法在执行时,先加载类对象,后创建对象实例;调用main方法new Test(),先加载Test类对象时,发现存在Test的父类Base的存在,加载父类,若Base检测处还存在相应的父类,则再次加载它的父类,直到将所有的相关父类都被加载完毕。
static代码块在类加载时被调用,且只调用一次,若下次在创建相同的类的实例,则static方法不会被再次执行。先加载完父类Base的static方法后,再加载子类类对象,并且调用子类类对象的static代码块。
类加载完毕后,才开始创建对象,先执行父类ide构造方法,而后执行子类的构造方法。
二、static关键字
static关键字可以用于修饰类的成员变量,类的成员方法,以及用于编写static代码块来优化程序性能
1、static变量
static变量也称为静态变量
变量 | 区别 |
静态变量 | 被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化 |
非静态变量 | 被对象拥有,在创建对象的时候初始化,存在多个副本中,在各个对象拥有的副本中,但互不影响 |
2、static方法
static方法就是没有this的方法,在static方法内部不能调用非静态的方法,反之可以,可以在没有创建任何对象的前提下,直接通过类本身调用static方法
main方法就是最常见的static方法,因为程序在执行main方法的时候没有创建任何对象,因此只能通过类名来访问。
3、static代码块
用于优化程序功能
可以至于类的任何地方,类中可以有多个static代码块,在类初次被加载时,会按照static代码块的顺序来执行每个static代码块,并且只会被执行一次。
4、static关键字的误区
this不能同于访问静态成员变量?
这个说法是错误的,this代表的是当前对象,在static方法中不能使用this,因为static在类初次加载时被调用,而此时尚未创建实例对象。
在static方法外的地方,可以用this调用static成员变量。static成员变量,static方法以及static是属于类对象的,不属于对象实例。在static方法外,使用this调用静态成员变量时,按照代码的执行顺序,当前类的类对象已经被加载完毕,static成员变量已经存在,而静态成员变量是被所有实例对象所共享的,所以可以被调用。
实战演示:
public class Main {
static int value = 33;public static void main(String[] args) throws Exception{
new Main().printValue();
}
private void printValue(){
int value = 3;
System.out.println(this.value);
}}
输出:33
说明:this代表当前对象,this.value实际上调用的当前对象的成员变量,而value虽然被static修饰,为静态成员变量,但静态成员变量被所有的对象实例所共享,所以输出33。而int value = 3 是printValue()方法内部的局部变量,与this不关联。
fianl关键字
final:最终的,不可变的
final可以修饰变量,方法,类,甚至方法参数
1、final关键字声明的变量,我们称之为常量,必须对该值初始化操作
修饰基本数据类型和引用类型
- 当修饰的是一个基本数据类型时,该基本数据类型的值一旦初始化后,就不能发生变化
- 当final修饰一个引用类型时,初始化后,就不能将其改为指向其他对象,但该引用指向的对象的内容是可以发生改变的
2、final关键字声明方法时,该方法为最终方法,且只能被子类继承,不能被子类重写。
3、final关键字声明类时,该类为最终类(不可变的类),final修饰的类无法被继承。
4、final关键字声明方法参数时,在该方法内部不能修改参数的值。