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 classfinal 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修饰可以提高性能,但是会降低程序的可扩展性(灵活性)。