final关键字(※)

final可以修饰类、修饰方法、修饰变量。

  • 被final修饰的类,不能被其他类继承;

  • 被final修饰的方法,不能被子类重写;

    • 重写了父类就会报错

      image-20240117160048907

  • final修饰变量

    • 如果修饰的是基本数据类型: 数据值不能改变
    • 如果修饰的是引用数据类型: 地址值不能改变,但是地址值中的数据内容可以改变;

Examples

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1, 父类的方法用final修饰,子类就不能重写
// 创建子类对象,调用final的abc方法, abc方法是父类的
Zi z = new Zi();
z.abc();

// 2, final修饰的变量,不能改变值
final int a = 5;
// a = 6;

// 3, final修饰的引用数据类型(数组, 集合等),不能修改地址值
final int[] arr = {2, 5, 8};
// arr = new int[3]; 报错,因为对象变化了,地址值也会变化,跟final违背
// 但是可以更改地址值内的数据
arr[1] = 10;
System.out.println(arr[1]);

Important

  • 如果被Static final 修饰, 例如
1
2
3
public class Constant(){
public static final String ip = "192.168.88.100";
}

则被称为常量, 通常用于记录系统的配置信息.

抽象类

由于接口的存在, 抽象类已经很少使用了.

概述

1
当我们无法详细的描述一类事物的具体功能的时候,可以采用抽象类的形式描述这种事物具备的特征和一定具有的功能,具体的功能内容将来由子类负责完成,次数就可以使用抽象类的技术描述这种事物;

为什么要使用抽象类(※)

1
因为使用抽象类的抽象方法描述一些功能的时候,可以"强制"子类必须完成某些功能!

什么时候可以使用

1
凡是遇到无法详细描述的类,都可以使用抽象类,或者一些特定的设计模式,例如: 模版设计模式,适配器设计模式...

如何使用

1
使用abstract关键字修饰类或方法即可;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public abstract class Animal {
// 所有的动物都一定有名称,年龄
private String name ;
private int age;

// 所有的动物都一定能吃饭,但是具体吃什么,在这个父类中无法详细的描述,但是可以通过具体的子类描述
// 一旦父类写了抽象方法,那么就会强制子类,必须重写该方法,如果不重写,语法错误
public abstract void eat();
}
public class Pig extends Animal{
public Pig(String name, int age) {
super(name, age);
}

public Pig() {
}

@Override
public void eat() {
System.out.println(super.getAge()+"岁的"+super.getName()+"正在吃白菜...");
}
}
public class Test {
public static void main(String[] args) {
// 1: 创建子类对象
Pig p = new Pig("佩琪",3);
// 2: 调用eat方法
p.eat();

// 3: 尝试直接创建 Animal 对象
//Animal a = new Animal();// 抽象类不能直接创建对象
}
}

注意Notice

image-20240117165042966