- 修饰类
当用final去修饰一个类的时候,表示这个类不能被继承。简称为“断子绝孙类”。用final来修饰类的时,说明这个类从设计之初,就不打算用来被继承,换句话说,也不允许其他人来继承这个类,从而保证安全性。
a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为final
b. final类中的成员方法都会被隐式的指定为final方法。
2.修饰方法
被final修饰的方法不能被重写。当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被子类继承。
一般用final修饰方法的目的是:锁住方法,防止继承它的类来修改(覆盖)它。
a. 一个类的private方法会隐式的被指定为final方法。
b. 如果父类中有final修饰的方法,那么子类不能去重写。
- 修饰成员变量
a. 必须初始化值。
b. 被final修饰的成员变量赋值,有两种方式:1、直接赋值 2、全部在构造方法中赋初值。
c. 如果修饰的成员变量是基本类型,则表示这个变量的值不能改变。
d. 如果修饰的成员变量是一个引用类型,则是说这个引用的地址的值不能修改,但是这个引用所指向的对象里面的内容还是可以改变的;比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
e. 如果修饰类的成员变量,则必须当场赋值,否则编译会报错。
final class Person {
String name ="zs";
//3. 此处不赋值会报错
//final int age;
final int age = 10;
}
public class Demo01 {
public static void main(String[] args) {
//1. 基本数组类型为常量,无法修改
final int i = 9;
//i = 10;
//2. 地址不能修改,但是对象本身的属性可以修改
Person p = new Person();
p.name = "lisi";
final int[] arr = {1,2,3,45};
arr[3] = 999;
//arr = new int[]{1,4,56,78};
}
}
4.修饰方法参数
在我们编写方法时,可以在参数前面添加final关键字,它表示在整个方法中,我们不会(实际上是不能)改变参数的值。当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。 注:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。 final不能用于修饰构造方法。
public class Test4 {
public static void main(String[] args) {
new Test4().f1(2);
}
public void f1(final int i) {
//i++; //i是final类型的,值不允许改变的.
System.out.print(i);
}
}
指向对象或数组的地址的引用不能修改。例子如下:
//例3
public class Demo{
public static void main(String[]args){
final Cat cat1=new Cat(1);
Cat cat2=new Cat(2);
cat1=cat2;
}
}
class Cat{
private int id=0;
private int age=0;
Cat(int id){this.id=id;}
public void setAge(int age){
this.age=age;
}
}
![](https://img.haomeiwen.com/i6604461/0d37358ef284bd51.png)
当用final来修饰对象时,不能改变对象的引用,但是可以修改对象的属性值。cat1只能指向id为1的猫,如果让它指向cat2所指的猫,编译器会报错(例3)。
final 和 static的区别
用final修饰,主要是为了表现“不可修改性”,提高安全性 。
static重点在于共享,方便。在类里创建一个static修饰的函数,则可以直接通过类名访问,该类new出来的对象,也可以共享static函数,或者static修饰的共有属性。
网友评论