面向对象高级(3)类中属性赋值与final关键字
面向对象高级(3) 类中属性赋值与final关键字
先后加载顺序总结:
默认初始化赋值、显式赋值/代码块、构造器、属性/方法。
关于显式赋值与代码块的执行先后:
首先,由于static修饰的结构随着类的加载而加载,所以static修饰的结构先于菲static修饰的结构执行。而在静态变量与静态代码块之间的先后则取决于代码的先后。
练习:
public class Exercise1 {
public static void main(String[] args) {
//static blocks
//父静。子静
Son son = new Son();
//not static blocks
//父非静、父构造
//在创建子类对象之前,需要先初始化父类
//子菲静、子构造
}
}
class Father{
static{
System.out.println("(1)父类的静态代码块");
}
{
System.out.println("(2)父类的非静态代码块");
}
Father(){
System.out.println("(3)父类的无参构造");
}
}
class Son extends Father{
static{
System.out.println("(4)子类的静态代码块");
}
{
System.out.println("(5)子类的非静态代码块");
}
Son(){
System.out.println("(6)子类的无参构造");
}
}
final关键字
1、final关键字的作用
表示这个类不能被继承、表示此方法不能被重写、表示此变量不能被改变。
如果某个成员变量用final修饰后,没有set方法,则该成员变量必须初始化。可以显式赋值、或在初始化块赋值、实例变量还可以在构造器中赋值。
当用final修饰成员变量的时候,可以将此变量看作常量,变量名均大写。
常见简例:
final int MONEY = 0;
因为此时MONEY为常量,return MONEY的值时不能写作MONEY++;
但是可以写作return MONEY+1;
public class Final {
public static void main(String[] args) {
Other o = new Other();//创建实例对象
new Final().addOne(o);//创建匿名对象...?
System.out.println(o.i);
}
public void addOne(final Other o) {
// o = new Other();
o.i++;
}//o为常量,直接调用方法addOne
}
class Other {
public int i;
}