1、final修饰变量
代码示例:
package Package8_face_the_object.test_final;
//final关键字的用法
//一、final修饰变量
//类
class Dog{
int age;
double weight;
}
public class Test1 {
public static void main(String[] args) {
//第1种情况:
//final修饰一个变量,变量的值不可以改变,这个变量也变成了一个字符常量,约定俗称的规定:名字大写
final int A = 10;//final修饰基本数据类型
//A = 20;
//第2种情况:
//引用数据类型
final Dog d = new Dog(); //final修饰引用数据类型,那么地址值就不可以改变
//d = new Dog(); //重新再给一个指向(又创建了一块新的空间),但是加上final就不可以了
//地址里(d对象)的属性依然可以随意更改
d.age = 10;
d.weight = 12.24;
//第3种情况:
final Dog d2 = new Dog();
a(d2);//下面创建了一个a()方法
// 这里是可以调用的,虽然d2的值不能改,
// 但是调用a()方法的时候,d2的值传递给了d,而d的值是可以改变的,故不报错。
// 而,
// 像第4种情况就要报错了
//第4种情况:
b(d2); //b()方法中会报错
}
//a()方法
public static void a(Dog d){
d = new Dog();
}
//b()方法
public static void b(final Dog d){
//d = new Dog();
}
}
2、final修饰方法
final修饰方法,那么这个方法不可以被该类的子类重写。
3、final修饰类
final修饰类,代表没有子类,该类不可以被继承:
一旦一个类被final修饰,那么里面的方法也没有必要用final修饰了(final可以省略不写)。
代码示例:
package Package8_face_the_object.test_final;
//final关键字的用法
//二、final修饰方法
//三、final修饰类
public final class Test2 {
final public void eat() {
System.out.println("我热爱编程!");
}
}
/*
class test2 extends Test2{
//对父类的方法进行重写
@Override
public void eat() { //会报错
super.eat(); //会报错
}
} */
4、案例 —— JDK提供的Math类
看源码发现:
(1)使用Math类的时候无需导包,直接使用即可:
(2)Math类没有子类,不能被其他类继承了
(3)里面的属性全部被final修饰,方法也是被final修饰的,只是省略不写了
原因:子类没有必要进行重写。
(4)外界不可以创建对象:
Math m = new Math();
(5)发现Math类中的所有的属性,方法都被static修饰
那么不用创建对象去调用,只能通过类名.属性名、类名.方法名去调用 。