Java继承——final关键字的使用
- 1. final修饰类
- 2. final修饰方法
- 3. final修饰方法内的局部变量
- 4. final修饰成员属性
- 5. final修饰引用数据类型的实例化对象
- 6. final是不能修饰构造方法的
- 7. 小结
1. final修饰类
(1) 在Animal类中添加final关键字:public final class Animal{...}
,则表示Animal这个类是不允许有子类的,也即“终极类”;
(2) final class:该类没有子类,public final class
与final public class
都可以。
2. final修饰方法
在一个类中,如果不希望这个类中的方法被子类重写,则可以使用final关键字,例如,在Animal类中的eat方法前使用final修饰:
// 吃东西
public final void eat() {
System.out.println(this.getName() + "在吃东西");
}
则,子类Dog中就不能重写eat方法
即,如果final 方法
,则该方法不允许被子类重写,但是可以正常被子类继承使用。
3. final修饰方法内的局部变量
例如:
public void eat() {
final int temp;//方法内的局部变量
// temp=12;
System.out.println(this.getName() + "在吃东西");
temp=12;
System.out.println(temp);
}
注:final修饰的局部变量无需立即赋值,只要在方法内输出之前进行赋值即可。
即,final修饰方法内局部变量:只要在具体被使用事前进行赋值即可,一旦赋值不允许被修改。
4. final修饰成员属性
(1) 例如在Animal中使用final修饰temp属性:
public final int temp=12;
那么类中其他方法或构造方法中temp就无法被赋值。
(2) 如果final修饰属性时没有被赋值:
public final int temp;
那么只有两个位置可以进行赋值操作:
a. 构造方法处
public Animal() {
month = 2;
temp=20;
System.out.println("我是父类的无参构造方法");
}
b. 构造代码块处
{
temp=12;
System.out.println("我是父类的构造代码块");
}
即,final修饰类中成员属性时,赋值过程有以下三种途径:定义直接初始化;构造方法;构造代码块。
/* final class:该类没有子类 public final class \ final public class
* final 方法:该方法不允许被子类重写,但是可以正常被子类继承使用
* final 方法内局部变量:只要在具体被使用之前进行赋值即可,一旦赋值不允许被修改
* 类中成员属性:赋值过程:1、定义直接初始化 2、构造方法 3、构造代码块
*/
5. final修饰引用数据类型的实例化对象
(1) 重温数据类型以及问题提出
数据类型分为基本数据类型和引用数据类型。其中基本数据类型为int、float、double等,这些数据类型可以直接被赋值;引用数据类型为类、String、System、数组等,这些数据类型需要实例化,那么这些引用数据类型被final修饰后,引用地址是否可以发生改变呢?属性值是否可以发生改变呢?
(2) final修饰引用类型的实例化对象
public void eat() {
final int temp;//方法内的局部变量
// temp=12;
System.out.println(this.getName() + "在吃东西");
temp=12;
System.out.println(temp);
final Animal animal = new Animal("喵喵",1);
// animal = new Animal;
animal.name="豆豆";
}
当final修饰的变量是引用类型的时候,在实例化之后,就不允许重新进行引用地址的修订了,例如,在final Animal animal = new Animal("喵喵",1);
后,上面代码中animal = new Animal;
就会报错;但是,里面的属性值可以根据我们的需要进行修改,例如上面代码中animal.name="豆豆";
就是修改操作。
(3) 对于变量而言,如果我们既不希望在程序中被修改,同时有希望作为全局变量存在,就可以同时使用static和final来修饰
例如:
public final static int temp=12;
注:final和static的顺序可以改变。
6. final是不能修饰构造方法的
7. 小结
final:
(1) 修饰类表示不允许被继承;
(2) 修饰方法表示不允许被子类重写;
a. final修饰的方法可以被继承;
b. 不能修饰构造方法。
(3) 修饰变量表示不允许修改
a. 方法内部的局部变量,在使用之前被初始化赋值即可;
b. 类中成员变量,只能在定义时、构造方法、构造代码块中进行;
c. 基本数据类型的变量,初始赋值之后不能更改;
d. 初始化之后不能再指向另一个对象,但对象的内容是可变的。
(4) 可配合static使用
常用于配置信息,即加载一次即可,无需进行后续修订的内容,例如:
public static final String URL="www.123.com"
(5) 使用final修饰可以提高性能,但是会降低程序的可扩展性(灵活性)。