一、super关键字
它是一个指代变量,用于在子类中指代父类对象。
1.作用
指代父类对象
区分子父类同名的成员变量,区分父类中成员变量和子类中同名的局部变量
2.使用
与this相同,调用父类成员变量和成员方法:super.xx super.xxx()
调用父类构造器 super(xxx)
如果子类没有显示调用父类构造器,系统会默认在子类构造器首行调用父类空构造器
super.属性名//访问父类的属性
super.方法名(参数);//调用父类的方法。
super(参数);//调用父类的构造方法。
//初始化当前对象的父类型特征
super能出现在实例方法和构造方法中,不能使用在静态方法中。且大部分情况下可以省略。
super()只能出现在构造方法第一行,通过当前的构造方法去调用、"父类"中其它的构造方法,目的是:代码复用(创建子类对象的时候,先初始化父类型特征)。
建议手动写无参构造方法
一个类如果没有手动提供任何构造方法,系统会默认提供一个无参数构造方法。
一个类如果手动提供了一个构造方法,那么无参数构造系统将不再提供。
重要的结论:
当一个构造方法第一行既没有this()又没有super()的话,默认会有一个super();表示通过当前子类的构造方法调用父类的无参数构造方法。所以必须保证父类的无参数构造方法是存在的。
注意:this ()和super()不能共存,它们都是只能出现在构造方法第一行。
public class SuperTest {
public int num = 20;
public SuperTest() {
}
public SuperTest(int num) {
this.num = num;
}
public void test(){
System.out.println(num);
}
}
class superSon extends SuperTest{
private int num3 = 20;
public superSon() {
super();
}
public superSon(int num) {
this();//解决 this()和super()不能共存问题
}
}
二、final关键字
表示最终的,不可被修改的。
1.被final修饰的变量为常量(标识符规范)
可以修饰局部变量也可以修饰成员变量
public class FinalTest {
private final int num = 50;
public void test(){
final int num2 = 20;
}
}
image.png
由图可见,在为被final修饰的变量重新赋值时,会报编译错误。
2.被final修饰后的方法不能被重写
public class FinalTest {
public final void test(){
int num2 = 20;
}
}
class FinalSon extends FinalTest{
//报编译异常,此重写不可行
/*public void test(){
}*/
}
image.png
3.被final修饰的类不能被重写
public final class FinalTest {
public void test(){
int num2 = 20;
}
}
class FinalSon extends FinalTest{
}
image.png
由此可见,被final修饰的类,不可被继承,所以也称这种被final修饰的类为“太监类”(没儿子 /狗头)。