Java第二阶段---12继承---第三节 final 修饰符
1.应用范围
final修饰符应该使用在类、变量以及方法上
2.final修饰类
注意,你也可以声明整个final。声明为final的类不能被子类化。例如,当创建不可变类(String类)时,这特别有用。
如果一个类被final修饰,表示这个类是最终的类,因此这个类不能够再被继承,因为继承就是对类进行扩展。
示例
package com.cyx.inheritance._final;//final修饰的类不能够被继承
public final class FinalClass {public void show(){System.out.println("这是最终类里面的方法");}}package com.cyx.inheritance._final;
//这里会报编译错误,因为FinalClass不能被继承
public class ChildClass extends FinalClass{
}
3.final修饰方法
你可以将类的某些或所有方法声明为final。在方法声明中使用final关键字表示该方法不能被子类覆盖。object类就是这样做的-它的许多方法都是最终的。
示例
package com.cyx.inheritance._final;public class FinalMethod {public final void show(){System.out.println("这是一个最终方法,不能被重写");}
}package com.cyx.inheritance._final;public class ChildMethod extends FinalMethod {//这里会报编译错误,因为父类中的show()方法是最终的,不可被重写public void show(){}
}
4.final修饰变量
final修饰变量的时候,变量必须在对象构建时完成初始化。final修饰的变量称为常量。
示例
package com.cyx.inheritance._final;public class FinalVariable {//final修饰的变量一定要在对象创建时完成赋值操作,final修饰的变量称之为常量,不可被更改private final int number;//可以直接赋值:private final int number= 10;//static final修饰的变量就是静态常量public static final String COUNTRY = "中国";public FinalVariable(){this.number = 10;}public void change(){
// this.number = 11;//报错,因为number是一个常量,不能再被更改,因此会报编译错误}
}
思考如下代码的执行过程:
package com.cyx.inheritance.test;public class Father {static{System.out.println("父类静态代码块执行");}public Father(){super();System.out.println("父类构造方法执行");}
}
package com.cyx.inheritance.test;public class Child extends Father{static{System.out.println("子类静态代码块执行");}public Child(){super();System.out.println("子类构造方法执行");}
}
package com.cyx.inheritance.test;public class test {public static void main(String[] args){new Child();//构建Child对象时,发现Child是Father的子类,而Father又是object的子类。因此JVM会首先加载object类//然后再加载Father类,最后再加载Child类。而静态代码块是在类第一次加载时执行,而且只会执行一次。因此//Father类中的静态代码块先执行,然后再执行Child类中的静态代码块,然后才执行new Child();代码,他要去调用父类的构造方法,所以打印是父类构造方法执行再子类构造方法执行//打印顺序://父类静态代码块执行//子类静态代码块执行//父类构造方法执行//子类构造方法执行}
}
从new Child()进去,进去Child类中发现Child他被Father继承,所以最先进入Father类(要不然继承 继承哪里来呢),Father进入,所以Father里面的static最先运行,然后再加载Child里面的static,然后往下走,Child要掉super(),进入Father里面调父类构造方法(即先调用父类,再调用子类构造方法)