进阶:final
2020-04-24 本文已影响0人
雪上霜
-
final关键字
- 表示最终的,不可变的。
- 可以修饰变量,方法,类等。
- final修饰的类无法继承。
- final修饰的方法不能被覆盖。
- final修饰的局部变量不能重新赋值。final修饰的变量只能赋值一次。
- final修饰的引用只能指向一个对象,只能永远指向该对象。并且在该方法执行过程中,该引用指向改对象之后,该对象不会被垃圾回收器回收, 直到当前方法结束,才会被释放。对象内的数据可改。
-
final修饰的实例变量,系统不管赋默认值,必须程序员手动赋值。在构造方法中赋值和在属性后直接赋值都可。
-
final修饰实例变量一般添加static修饰。
-
static final联合修饰的变量称为常量,建议大写,每个单词之间采用下划线衔接。
-
常量和静态变量都存储在方法区,并且都是在类加载时初始化。常量一般都是公开的。
public class FinalTest{ public static void main(String[] args){ final int i = 100; } } final class A{ } //B类继承A类,对A进行扩展,加个final则A就不能被继承。 class B extends A{ } //String 不能被继承。 class MyString extends String{ } class C{ public final void doSome(){ } } //D中doSome不能覆盖C中的 class D extends C{ public void doSome(){ } }
public class FinalTest{ public static void main(String[] args){ Person p1 = new Person(20); System.out.println(p1.age); final Person p = new Person(20); p = new Person(30); //错误,无法给p分配值。 p.age = 30; //可以 } } class Person{ int age; public Person{ } public Person(int age){ this.age = age; } }
public class FinalTest{
public static void main(String[] args){
}
}
class User{
final int age; //实例变量 ,错误。
final int age = 10; //可以
final double weight;
public User(){
this.weight = 80; //只要在系统赋默认值之前赋值即可。可以
}
}
public class FinalTest{
public static void main(String[] args){
}
}
class User{
String idCard;
String name;
public static final String country = "中国";//实例变量在堆中,一个变量一份。实例变量使用final修饰,说明该实例变量不会随对象的变化而变化。
}