一、super关键字
1、 super与this的对比
this:
this 能出现在实例方法和构造方法中;
this 的语法是 this.和this();
this 不能使用在静态方法中;
this. 大部分情况下可以省略,在区分局部变量和实例变量时不能省略。
public void setName (String name){
this.name = name;
}
this()只能出现在构造方法的第一行,通过当前构造方法去调用本类中的其他构造方法,目的是实现代码复用。
super:
super 能出现在实例方法和构造方法中;
super 的语法是 super.和super();
super.属性名 // 访问父类的属性
super.方法名(实参) // 访问父类的方法
super(实参) // 调用父类的构造方法
super 不能使用在静态方法中;
super. 大部分情况下可以省略,在以下情况不能省略:
父类和子类中有同名属性,或者说有同样的方法,
想在子类中访问父类的,super. 不能省略。
super()只能出现在构造方法的第一行,通过当前构造方法去调用父类中的
其他构造方法,目的创建子类对象的时候,先初始化父类型特征。
super 不是引用,也不保存内存地址,不指向任何对象。
从内存图来看,super 只代表当前对象内部的一块父类型特征。
输出引用时,会自动调用引用的toString()方法
System.out.println(this.toString);
System.out.println(super); // 报错 需要"."
2、 super()
表示通过子类的构造方法调用父类的构造方法。
当一个构造方法第一行既没有this()又没有super()时,默认会有一个super();表示通过当前子类的构造方法调用父类的无参数构造方法;因此必须保证父类的无参数构造方法是存在的。
父类的构造方法无论如何都会执行。
子类构造方法执行时必然调用父类构造方法。
Object类的无参数构造方法一定会执行。
super(实参)的作用是初始化当前对象的父类型特征。
并不是创建新对象,实际上对象只创建了一次。
3、 this()和super()不能共存,
两者都只能出现在构造方法的第一行。
二、一些知识杂烩
1、 方法覆盖需要和多态机制联合起来使用才有意义。
Anima a = new Cat();
a.move();
目的:编译的时候move()方法是Animal的,
运行的时候自动调用子类Cat重写的move()方法。
假设没有多态机制,方法覆盖存在的意义不大。当父类的方法无法满足子类业务需求时,子类可以定义一个全新的方法。
2、 静态方法不存在方法覆盖。
方法覆盖只是针对于“实例方法”,“静态方法覆盖”没有意义。
静态方法的执行不需要对象,不适用多态机制。
假设eat()是静态方法,
Animal b = new Dog();
b.eat();
// 相当于类.eat();
// 调用Animal的eat方法.
3、 私有方法不能覆盖。
4、 方法覆盖中,方法的返回值类型
什么条件满足之后,会构成方法的覆盖呢?
① 发生具有继承关系的两个类之间。
② 父类中的方法和子类重写之后的方法:
具有相同的方法名、相同的形式参数列表、相同的返回值类型。
学习了多态机制之后:
“相同的返回值类型”可以修改一下吗?
对于返回值类型是基本数据类型来说,必须一致。
对于返回值类型是引用数据类型来说,重写之后返回值类型可以变的更小。
(意义不大,实际开发中没人这样写。)