1.先说以下为什么要用final吧!
继承的出现提高了代码的复用性,方便了开发,但是也出现了一些问题,有些类在描述之后,不想被继承,
或者是有些类中的部分方法是固定的,不想被子类进行重写,可是子类继承了这些方法后就可以对其
进行重写,这就需要解决的方法了.
要解决上面这个问题,就需要用到了final这个关键字了,final的意思是最终的意思,不可变.final它是个
修饰符,它可以修饰类,类的成员,以及局部变量.
2.介绍一下final的特点:
(1)final修饰的类不能够被继承,但是可以继承别的类,如下:
一个普通的类:class Test{}
一个加了final的类:final class Test2{}
另外一个普通的类: class Test3{}
final class Test2 extends Test{} ://可以继承Test类
class Test3 extens Test2{} ://这个是不能继承Test2的
(2)final修饰的方法不能够被继承,父类中没有被final修饰的方法,子类覆盖后可以加final.
class Test{
public final void method(){} //被final修饰的方法是能够被继承的,但是不能够覆盖
public void method2(){}
}
class Test1 extends Test{
public final void method2(){}; //重写了父类中的方法
}
(3)final修饰的变量为常量,这些变量只能赋值一次
final int i=20;
i=22;//这样就会赋值报错,final修饰的变量只能赋值一次
(4)引用型的变量值为对象地址值,地址值不能改变,但是地址值内的对象属性可以修改
final Person p=new Person();
Person p2=new Person();
p=p2;//final修饰的变量p,所记录的地址值不能改变
p.name="孙悟空";//可以改变p对象的name属性值
(5)修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造方法的均需要为其赋值。)
class Test{
final int i=188;//直接给变量赋值
final int a;//final修饰的成员变量,需要在创建对象前赋值,否则就会报错啦
public Test(){
n=166;//可以在创建对象所调用的构造方法为变量赋值
}
}