文章目录
b站学习视频以及笔记-尚硅谷_Java零基础教程
final关键字:最终的
1. 可以用来修饰:类、方法、变量
2. 具体的:
2.1 final 用来修饰一个类:此类不能被其他类所继承。
比如:String类、System类、StringBuffer类
2.2 final 用来修饰方法:表明此方法不可以被重写
比如:Object类中getClass();
2.3 final 用来修饰变量:此时的"变量"就称为是一个常量
2.3.1 final修饰属性:
可以考虑赋值的位置:显式初始化、代码块中初始化、构造器中初始化。
不能采用方法赋值,通过方法去赋值,是会报错的,因为方法太晚了,构造器一旦调用完成,对象就造出来了,在堆空间相应的属性就加载了,属性就应该有值了,我们通过对象去调方法,只是都属性值进行修改,但是由于是常量,无法修改。所以不使用方法赋值。
2.3.2 三种赋值的具体使用
使用情况:
- 显示初始化,当要属性的的值都一样时。
- 当这个值不是简简单单的值,而是调的另外一个方法,而且这个方法还抛异常,就只能在代码块中赋值。
- 构造器赋值,多个对象,大家拥有的属性值都不一样。
- 注意:如果有多个构造器,只在构造器中赋值的常量必须在每个构造器都要赋值,否则会报错,因为我们用不同的构造器造对象时,属性都要被重新赋值。
2.3.3 final修饰局部变量:
尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。
2.3.4 static final:
用来修饰属性:全局常量
3. 代码实现
public class FinalTest {
//编译出错,不能默认初始化
// final int tao;
//显示初始化,当属性的值都一样时,
//比如此处的WIDTH、LEFT、RIGHT都为0时,采用显式初始化赋值
final int WIDTH = 0;
final int LEFT;
final int RIGHT;
// final int DOWN;//通过方法去给DOWN赋值是不靠谱的
//当这个值不是简简单单的值,而是调的另外一个方法,而且这个方法还抛异常,就只能在代码块中赋值
{
LEFT = 1;
}
//构造器赋值,多个对象,大家拥有的属性值都不一样
public FinalTest(){
RIGHT = 2;
}
//如果有多个构造器,只在构造器中赋值的常量必须在每个构造器都要赋值,否则会报错,
//因为我们用不同的构造器造对象时,都RIGHT都要被重新赋值
public FinalTest(int n){
RIGHT = n;
}
//通过方法去赋值,是会报错的,因为方法太晚了,构造器一旦调用完成,对象就造出来了,在堆空间相应的属性就加载了,
//属性就应该有值了,我们通过对象去调方法,只是都属性值进行修改,但是由于是常量,无法修改。所以不使用方法赋值。
// public void setDown(int down){
// this.DOWN = down;
// }
public void doWidth(){
// width = 20;
}
public void show(){
final int NUM = 10;//常量
// NUM += 20;常量不能改变值,只能赋一次值
}
public void show(final int num){
//num = 20;//编译不通过,我们在调用该方法时,传递实参给形参,给常量形参赋一个实参。一旦赋值 以后,
//就只能在方法体内使用此形参,但不能进行重新赋值。
System.out.println(num);
}
public static void main(String[] args) {
int num = 10;
num = num + 5;
FinalTest test = new FinalTest();
// test.setDown(3);
test.show(10);
}
}
final class FinalA{
}
//class B extends FinalA{
//
//}
//class C extends String{
//
//}
class AA{
public final void show(){
}
}
class BB extends AA{
// public void show(){
//
// }
}
4. native关键字:
本地的,调用底层的C、C+++,具体调用在Java中隐藏起来了
5. final关键字的应用举例
public final class Test {
public static int totalNumber = 5;
public final int ID;
public Test() {
ID = ++totalNumber; // 可在构造器中给final修饰的“变量”赋值
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.ID);//6
Test t1 = new Test();
System.out.println(t1.ID);//7,以后每创建一个无参构造函数id就会加一
final int I = 10;
final int J;
J = 20;
J = 30; // 非法
}
}
public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
// o = new Other();不合法
o.i++;//合法。变量o是常量,但是它的属性不是常量可以变。
//比如说你找了一个女朋友,他是你的final,她是你最后的老婆了,
//然后她是你最后一个老婆不会变,但是她的容貌会随着时间的流逝
//而变化,所以属性是可以变化的。
}
}
class Other {
public int i;
}