继承中构造方法的关系?
记住下面几点结论:
- 子类中所有的构造方法默认都会访问父类中空参数的构造方法,因为子类会继承父类中的数据,可能还会使用父类的数据。
- 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。,系统帮我们默认添加
- 父类没有无参构造方法,子类怎么办? super解决或者this解决。 super(…)或者this(….)必须出现在构造方法的第一条语句上
package com.company;
public class Welcome {
public static void main(String[] args) {
Son S = new Son(18, "张三");
/*
执行到创建对象之后,
先调用子类中的构造方法,如果没有参数,则默认调用父类的无参构造方法初始化对象
如果有参数,则通过super(参数名) 传递到父类的默认参数,进行初始化
*/
System.out.println(S.age);
}
}
class Father {
int age;
String name;
Father(int age, String name) {
this.age = age;
this.name = name;
System.out.println("我是父类里有参数构造方法");
}
}
class Son extends Father {
Son(int age, String name) {
super(age, name); // super()系统默认加的这句话,用来调用父类里的构造方法,根据是否传值来确定调用有参数或者没有参数的方法
System.out.println("我是子类里有参数构造方法");
}
}
-------------------------
我是父类里有参数构造方法
我是子类里有参数构造方法
18
方法重写
子类通过重写父类的方法,可以用自身的行为替换父类的行为。方法的重写是实现多态的必要条件。
应用场景
当父类的方法实现不能满足子类需求时,可以对方法进行重写。重写父类的方法分为2重情况:覆盖父类的方法,或者对父类方法进行扩展
覆盖父类的方法
- 父类的方法实现和子类的方法实现,完全不同就可以使用覆盖的方式,在子类中重新编写父类的方法实现。
- 在子类中定义一个和父类同名的方法并且实现。重写之后,只会调用子类中重写的方法,而不会调用父类封装的方法
对父类方法进行扩展
- 子类的方法实现中包含了父类的方法实现(父类原本封装的方法实现就是子类方法的一部分)就可以使用方法扩展了。
- 具体实现方式是,首先在子类中重写父类的方法(定义于父类方法同名)
- 在需要的位置使用super()。父母方法来调用父类方法的执行
- 代码其他位置针对子类的需求编写子类特有的代码实现
package com.company;
public class Welcome {
public static void main(String[] args) {
Son S = new Son();
S.eat(); // 方法重写后,子类有就调用子类的
}
}
class Father {
public void eat() {
System.out.println("吃饭");
}
}
class Son extends Father {
public void eat() {
super.eat(); // 调用父类的eat()方法,
System.out.println("吃冰激凌");
}
}
-------------------------
吃饭
吃冰激凌
注意点:
- 方法名、形参列表相同。
- 返回值类型和声明异常类型,子类小于等于父类。
- 访问权限,子类大于等于父类。、
- 父类中私有方法不能被重写
- 父类静态方法,子类也必须通过静态方法进行重写