final
1、final是Java语言中的一个关键字
2、final表示最终的,不可变的
3、《重点》final修饰的变量?
final修饰的局部变量,一旦赋值就不能重新赋值
4、《重点》final修饰的方法?
final修饰的方法无法被覆盖,被重写。
5、《重点》final修饰的类?
final修饰的类无法继承
6、final控制不了能不能调用的问题。final管的是啥?
final修饰的表示最后的,不能变的,不能改的。
重点【final修饰的变量只能赋一次值。】
public class FinalTest01{
public static void main(String[] args){
//局部变量
int i = 100;
i = 200;
//局部变量
final int k = 100;
//重新赋值
//错误:无法为最终变量k分配值
k = 300;
final int m;
//第一次赋值
m = 200;
//重新赋值
// m = 300; //错误
}
}
final class A{ //A没有子孙
}
//B类继承A类,相当于对A类的功能进行扩展。如果你不希望别人对A类型进行扩展。
//你可以给A类加final关键字,这样的话A类就无法继承了。
/*
class B extends A{
}
*/
//错误:无法从最终String进行继承
/*
class MyString extends String{
}
*/
class C{
public final void doSome(){
System.out.println("C' doSome");
}
}
class D extends C{
/*
public void doSome(){
System.out.println("D's doSome...");
}
*/
public void doOther(){
}
public static void main(String[] args){
//多态
C c = new D();
c.doOther();//报错了,因为编译器报错,编译器认为c是c类,c类中没有doOther()方法。
//调用子类中特有的方法时,需要向下转型。
if(c instanceof D){//c指向的对象如果确实是一个D类型。
D d1 = (D)c;
d1.doOther();
}
D d1 = (D)c;
d1.doOther();
//不用多态可以
D d = new D();
d.doOther();
}
}
final修饰的变量,如果这个变量是一个“引用”会怎样???
《重点》final修饰的变量只能赋一次值
“引用”是不是一个变量呢???是。
public class FinalTest02{
public static void main(String[] args){
Person p1 = new Person(20);
System.out.println(p1.age);
//-----------------------------------------------
final Person p = new Person(30);
p = new Person(30);
}
}
class Person{
int age;
public Person(){
}
public Person(int age){
this.age = age;
}
}
结论:
final修饰的实例变量,系统不负责赋默认值,要求程序员必须手动赋值。
这个手动赋值,在变量后面赋值可以,在构造方法中赋值也可以。
final关键字
1.1、final修饰的类无法继承。
1.2、final修饰的方法无法覆盖.
1.3、final修饰的变量只能城一次值。
1.4、final修饰的引用一旦指向某个对象,则不能再重新指向其它对象,但该引用指向的对象内部的数据是可以修改的。
1.5、final修饰的实例变量必须手动初始化,不能采用系统默认值。
1.6、final修饰的实例变量一般和static联合使用,称为常量。
public static final double PI = 3.1415926;