super调用父类方法和父类变量
覆盖(只发生在方法上):当父类和子类出现一模一样的方法时,优先运行子类方法
返回值类型 函数名 参数列表都一致
class Dad {
void study(){
System.out.println("good1");
} }
class Son extends Dad{
void study(){
System.out.println("good");
}}
public class ExtendsDemo {
public static void main(String[] args) {
Son son=new Son();
son.study();
}}
思想:手机生产
public class FugaiDemo {
public static void main(String[] args) {
NewPhone p=new NewPhone();
p.call();
}
}
class Phone{
public void set() {}
public void photo() {}
public void call() {
System.out.println("number");
}
}
class NewPhone extends Phone{
public void call() {
//System.out.println("number");
super.call();
System.out.println("pitc");
System.out.println("ling");
}
}
直接在原手机上更新功能更改工程量大,维护性低
父类已定义来电功能,可以把方法直接拿过来用
但子类对于功能的内容要有自己定义,保留父类功能的声明,建立子类功能特有的内容。实行覆盖
注意:子类方法覆盖父类方法时,必须保证子类方法权限的大于父类
Super关键字
子类对象初始化,都会先访问父类构造函数
因为子类继承父类的内容,所以创建对象时必须先看父类如何初始化的。
class Fu{
int num;
Fu(){
num=4;
System.out.println("fu run");
}}
class Zi extends Fu{
Zi(){
//super();
System.out.println("zi run");
}}
public class Demo1 {
public static void main(String[] args) {
Zi zi=new Zi();}}
子类构造方法都自带一个默认的super();方法引用父类构造函数
class Fu{
Fu(){
System.out.println("fu run");
}
Fu(int num)
{
System.out.println(num);
}}
class Zi extends Fu{
Zi()
{ //super();
System.out.println("zi run");
}
Zi(int num)
{
System.out.println(num);
}}
public class Demo1 {
public static void main(String[] args) {
Zi zi=new Zi(5);
}}
子类构造函数自带super();自动引用父类空参数构造函数
结果为:fu run 5
当父类没有空参数构造函数时,子类通过显示定义super语句指定访问父类的构造函数
Zi(int num)
{ super(num);
System.out.println(num);
}
用来调用父类构造函数的super();语句必须定义在子类的第一行,因为父类的初始化要先完成。
问题1
this 和super调用构造函数 可以同时存在吗?
答:不可以,因为都要放在构造函数第一行。
为什么需要定义在第一行?
答:因为构造函数初始化要先执行。