Java的继承:方法;属性?
Java的继承:方法;属性?
- 前言
- 前置知识
- 代码案例
前言
最近公司有个需求需要用 方法模板模式
改造一部分冗余的代码,因为涉及到Java中父、子类之间的继承
与重写
,所有来记录一下
这里抛出一个问题:前提 父类声明的子类对象(例如 父类 aa = new 子类()
)
如果aa 调用重写的方法 调用的是 父类的?还是子类的?
如果aa 调用重写的属性 调用的是 父类的?还是子类的?
结论:调用方法是子类重写的方法。而属性是父类的属性。
前置知识
绑定:指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定。
静态绑定:在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由 编译器或其它连接程序实现。
动态绑定: 在运行时根据具体对象的类型进行绑定。
结论:在Java中对属性采用静态绑定
,对方法采用动态绑定
。
代码案例
父类:
public class Animal {
public String name = "动物名";
public String moodName = "动物开心地";
public void eat() {
System.out.println("动物的吃法---");
System.out.println(this.name);
this.mood();
}
public void mood() {
System.out.println(this.moodName);
}
}
子类:
public class Dog extends Animal{
public String moodName = "小狗激动地";
@Override
public void mood() {
System.out.println("子类方法");
System.out.println(this.moodName);
}
}
主方法:
public class TestMain {
public static void main(String[] args) {
Animal dog = new Dog();
dog.eat();
}
}
输出:
分析一波:
- Animal dog = new Dog(); 这里 引用为父类,new的对象为子类
- dog.eat();因为Dog本身没有重写eat()方法,所以会走到父类的eat方法
- 紧接着打印“动物的吃法—”;打印Animal.name;
- 然后执行this.mood(); 因为子类已经重写该方法,所以执行子类的方法 打印“子类方法”、Dog.moodName