1.什么是final关键字
- final可以顾名思义,就是最终的,不可改变的,被它修饰东西都是无法改变的.
- 简单通俗理解就是"霸道",它不允许别人染指改变它看上的东西.
2.final用法
final的四种常用方法
- 可以用来修饰一个类
- 可以用来修饰一个方法
- 还可以用来修饰一个局部变量
- 还可以用来修饰一个成员变量
修饰类:
当final关键字用来修饰一个类的时候,格式:
public final class 类名称
{
// ...
}
被final修饰的类不能有任何的子类。
注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没有子类。)
修饰方法
当final关键字用来修饰一个方法的时候,这个方法就是最终方法,不能被覆盖重写。
格式:
修饰符 final 返回值类型 方法名称(参数列表)
{
// 方法体
}
注意:
对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾.
修饰变量
对于成员变量,局部变量来说,如果使用final关键字修饰,那么变量都是不可变。
- 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了.
- 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一.
- 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值,不能保证就采用直接赋值.
- 对于基本类型来说,不可变说的是变量当中的数值不可变
- 对于引用类型来说,不可变说的是变量当中的地址值不可变
public static void main(String[] args)
{
final int num = 20; //数值不可变
//num = 30; 再次赋值会报错
Student one = new Student("sikadi", 18);
System.out.println("打印的是地址值 " + one);
System.out.println("名字是 " + one.getName() + " 年龄是 " + one.getAge());
one = new Student("Lifu", 16);//新对象地址值会发生改变
System.out.println("新的对象是 " + "名字是 " + one.getName() + " 年龄是 " + one.getAge());
System.out.println(one); //如果使用final修饰,会无法new新的对象,即无法改变地址值
one.setName("yuki"); //但是可以改变其内容
System.out.println("更改名字为 " + one.getName() + " 年龄是 " + one.getAge());
}
3.四种权限修饰符
从左到右:修饰符权限从大到小
public > | protected > | (default) > | private | |
---|---|---|---|---|
同一个类(自己家) | √ | √ | √ | √ |
同一个包(邻居) | √ | √ | √ | × |
不同包子类(自己家孩子) | √ | √ | × | × |
不同包非子类(陌生人) | √ | × | × | × |