一、final
final修饰:大写,不可更改
1.修饰数据类型
1)修饰基本数据类型
2)修饰引用数据类型
final修饰的引用数据类型,地址值不可改变,但改地址中的属性值是可以改变的。
package com.rzd.no02oop.demo11;
public class Dog {
int age;
double weight;
}
package com.rzd.no02oop.demo11;
public class Test {
public static void main(String[] args) {
//final修饰基本数据类型
final int A = 10;
//A=100; //报错,不可修改
//final修饰引用数据类型
Dog d = new Dog();
d = new Dog(); //这里的d指向的地址与上一句不同,因为这里新创建了一个Dog对象,让d指向了新的地址
final Dog d2 = new Dog();
//d2=new Dog(); //报错,不可修改
//但是d2的属性可以改变
//d2.age = 100;
a(d2);
b(d2);
}
/*这里d2指向地址1,将d2地址作为参数给dog,dog指向地址1
走入a方法,新建了一个对象,dog指向新建的对象的地址2,
所以这里没有改变d2的地址,程序可以正常运行。
而b方法中,形参dog已经指向了d2的地址,且由final修饰不能改变,所以程序编译器就出错
*/
public static void a(Dog dog){
dog=new Dog();
}
public static void b(final Dog dog){
//dog=new Dog();
}
}
2.修饰方法
1)修饰类
final修饰的类不可以被继承,无子类。被final修饰的类里面的方法可以省略final(无子类自然不不可能会重写方法)
2)修饰方法
final修饰的方法不可以被重写。
3.例子
例如Math类
1)在java.lang包下,可以直接调动
2)被final修饰,无子类,Math里面的方法也不会被重写,因为都是数学上定义好的方法,不存在重写它们。
3)构造器被private修饰,表示其他的类无法调用到Math类的构造器(但是创建类的对象需要调用到构造器,那么也就是说外界无法创建Math类的对象Math m=new Math()),
4)Math类中的所有属性和方法都被final(通过类名.属性/方法名调用)和static(无需创建对象,类名.属性/方法名调用直接调用)