一. final
final常见的四种用法:
可以用来修饰一个类,方法,局部变量和成员变量
1.
当final关键字用来修饰一个类的时候
注意:
1.1 这个类不能有任何的子类(太监类),但是他可以有父类
1.2 一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写, 因为没子类
2.当final关键字用于修饰成员方法
2.1 当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能覆盖重写.
2.2 注意事项:对于类,方法来说,abstract 和final 是不能同时使用,因为矛盾。,abstract定义的抽象方法是一定要被覆盖重写的,而final就是不能覆盖重写。
3.final关键字作用于局部变量(只能赋值一次)
3.1一旦使用final用来修饰局部变量,那么这个变量就不能进行更改,一次赋值,终生不变。
3.2 对于基本类型来说,不可变说的是变量当中的数据不可改变。
但是对于引用类型来说,不可变说的是变量当中的地址值不可改变,但是内容可以改变(你叫A ,你改名成B ,但是你住的地方还是不变的。)
//创建一个学生类 并且有构造方法
public class Students {
private String name="A";
public Students()
{
}
public Students(String name)
{
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
final Students stu=new Students();
System.out.println(stu.getName()); //A
// stu=new Students("B"); 报错 因为final关键字后面的引用类型地址不可变
System.out.println("====================");
stu.setName("B");
System.out.println(stu.getName()); //B 内容是可以改变的,地址不能变
}
}
4.final关键字用于修饰成员变量
1.成员变量具有默认值值,所以用了final之后必须手动赋值,不会再给默认值了
2.对于final成员变量,要么使用直接赋值,要么通过构造方法赋值。
注意:二者只能选其一
3.如果选择第2个方法,必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值(至少有一个构造方法要对其赋值),并且删掉setter方法。
//第二种
public class Person {
private final String name; //没有默认值
public Person()
{
name="A”
}
public Person(String name)
{
this.name = name;
}
public String getName() {
return name;
}
//没有setter方法了
二.权限修饰符
public > protected> (default) > private
同一个类 (我自己) yes yes yes yes
同一个包 (我邻居) yes yes yes no
不同包子类 (我儿子) yes yes no no
不同包非子类 (陌生人) yes no no no
注意:
1.(default) 并不是default 是没写
2.在不同包 子类里面,必须是严格的一个包,如A包里面有B包 和a类 B包里面有b类,对于a类 b类来说。这是不同包
}