假设有一个子类和一个父类,
父类 dad = new 子类();
这时dad不能调用子类独有的方法,只能调用子类重写了父类的方法
但是为什么可以在子类重写父类的方法中调用子类独有的方法
public class Dad {
public void dad() {}
}
//这是父类
public class Son extends Dad{
@Override //重写方法
public void dad() {
this.son(); //这里可以调用子类独有的方法,但是对象是dad类的
}
public void son( ) {}//这是子类独有的方法
}
//这是子类
public class Text {
public static void main(String[] args) {
Dad dad = new Son();
dad.son()//报错,调用不了
dad.dad()//这样却可以间接调用son()
这是父类由子类实例化,new 后面是子类,则就是子类实例化,因为子类继承了父类,所以也继承了父类的方法和属性,当父类中有子类中没有的方法和属性时
子类调用此属性和方法时是父类中此属性和方法的值。当子类调用父类有相同的属性时,调用时是子类中定义的值。总的来说就是要看new后面谁,就是实例化谁。
在继承关系中,子类拥有父类和子类的方法,父类拥有自己的方法,所以无法调用子类,当父类方法被重写,父类对象调用的是子类重写的方法,这也就是多态的提现
可以了解下多态。 或者说面向对象的过程:封装,继承,多态。看看你就清楚了。
你要是想使用子类的特有方法需要使用向下转型,改为这么写
Dad dad = new Son();
Son son = (Son)dad;
son.son()//可以访问子类方法
dad.dad()//这个是重写的方法内部调用了特有方法
Dad dad = new Son();你这个都向上转型的,认得到就有鬼了兄弟
子类重写父类的这个方法后,谁执行这个独有的这个方法时,是动态分派的过程,此时相当于是子类调用的独有方法。
而且在java规定当中 重写方法不仅可以调用继承的变量和方法,还可以调用新方法和变量,也就是你说的调用独立方法
简而言之就是规定