言成言成啊 | Kit Chen's Blog

final关键字与权限修饰符

2019-09-24

一、final关键字

final关键字代表最终、不可改变的的。

常见四种用法:

  1. 可以用来修饰一个类
  2. 还可以修饰一个方法
  3. 还可以用来修饰一个局部变量
  4. 还可以用来修饰一个成员变量

修饰类

当final关键字用来修饰一个类的时候,

格式:

1
2
3
public final class 类名称 {
//...
}

含义:当前这个类,不能有任何子类,也就是太监类(继承就会报错)

注意:一个类如果是final的,那么其中的所有的成员方法都不能进行覆盖重写(因为没有儿子)

修饰方法

当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。

格式:

1
2
3
修饰符 final 返回值类型 方法列表(参数列表){
//方法体
}

注意事项:

对于类、方法来说,abstract和final关键字不能同时使用,因为矛盾(abstract是一定要被重写的,final关键字是不能被重写的)

修饰局部变量

Student.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Student {
private String name;

public Student() {

}

public Student(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

Main.java

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
35
public static void main(String[] args) {
int num=10;
System.out.println(num);//10
num=20;
System.out.println(num);//20


//一旦使用final来修饰局部变量,那么这个变量就不能进行更改
//一次赋值,终身不变
final int num1=10;
System.out.println(num1);//10
//num1=20;//错误写法,不能改变
//num1=10;//即使数值一样也是错误写法,只能赋值一次

final int num2;
num2=10;//这个是正确写法,只要保证赋值一次即可
System.out.println(num2);

//对于基本类型来说,不可变,指的是变量当中的值不可改变
//对于引用类型来说,不可变,指的是变量当中的地址值不可改变,但是存储的值是可以变的
Student stu1 = new Student("哈哈");
System.out.println(stu1);
System.out.println(stu1.getName());//哈哈
stu1=new Student("呵呵");
System.out.println(stu1);
System.out.println(stu1.getName());//呵呵

final Student stu2=new Student("娃哈哈");
System.out.println(stu2+stu2.getName());//地址不变+娃哈哈
// stu2=new Student("哦呵呵");//报错
// System.out.println(stu2+stu2.getName());

stu2.setName("哦呵呵");
System.out.println(stu2+stu2.getName());//地址不变+哦呵呵
}

修饰成员变量

对于成员变量来说,如果使用final关键字来修饰,那么这个变量也不可变

  1. 由于成员变量具有默认值,所以用了final之后,必须手动赋值,不然就是默认值,且无法改变
  2. 对于final的成员变量,要不直接赋值,要不通过构造方法赋值。二者选其一
  3. 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值,如果不能用,就直接赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Person {
//方案一
//private final String name="八戒";


//方案二
private final String name;


public Person() {
this.name="八戒";
}

public Person(String name) {
this.name = name;
}

}

二、权限修饰符

Java中有四种权限修饰符

public protected (default) private
同一个类(我自己) Yes Yes Yes Yes
同一个包(我邻居) Yes Yes Yes No
不同包子类(我儿子) Yes Yes No No
不同包非子类(陌生人) Yes No No No

注意事项:

(default)不是关键字,而是根本不写

阅读量