
为什么重写了的就不会使父类方法强制执行?
比如这个代码publicclassHaaa{publicstaticvoidmain(String[]args){Aa=newB();a.p();}}classA{pub...
比如这个代码
public class Haaa {
public static void main(String[] args) {
A a = new B();
a.p();
}
}
class A {
public void p() {
System.out.println("父类");
}
}
class B extends A {
public void p() {
System.out.println("子类");
}
}
输出:子类 展开
public class Haaa {
public static void main(String[] args) {
A a = new B();
a.p();
}
}
class A {
public void p() {
System.out.println("父类");
}
}
class B extends A {
public void p() {
System.out.println("子类");
}
}
输出:子类 展开
1个回答
展开全部
这种机制简单点说就是java就是这么做的,不要去想什么强制执行,就当规则记就好了。
规则:
编译时看引用类型,运行时多态。多态就是你看到的现象,这是java这门语言三大特点之一,封装,继承,多态。
解释下,编译时就是你写程序时,用的都是父类引用a,当你a.p()的时候这个时候只看你父类里面有没有p()这个方法,只要有java编译器就不找你麻烦。但是运行时的时候只看你new的那个是什么,你new的父类调用的就是父类的p(),你new的子类掉的就是子类的p()。这就是规则必须记住。
说点需要理解的,为什么要这么做,编程都是面向接口的,有些时候你关心的只是大的类型,具体什么类型产生什么行为那是运行时才有分别的,比如书上的例子经常是Animal会吃,你只要声明Animal的引用就可以了,Animal.eat()这个时候你只关心把东西吃掉。但是狗是嚼碎了吃,猫是添完再吃,这个你根本不用关心,程序运行的时候狗怎么吃,猫怎么吃自然就分开了。自己写例子吧
规则:
编译时看引用类型,运行时多态。多态就是你看到的现象,这是java这门语言三大特点之一,封装,继承,多态。
解释下,编译时就是你写程序时,用的都是父类引用a,当你a.p()的时候这个时候只看你父类里面有没有p()这个方法,只要有java编译器就不找你麻烦。但是运行时的时候只看你new的那个是什么,你new的父类调用的就是父类的p(),你new的子类掉的就是子类的p()。这就是规则必须记住。
说点需要理解的,为什么要这么做,编程都是面向接口的,有些时候你关心的只是大的类型,具体什么类型产生什么行为那是运行时才有分别的,比如书上的例子经常是Animal会吃,你只要声明Animal的引用就可以了,Animal.eat()这个时候你只关心把东西吃掉。但是狗是嚼碎了吃,猫是添完再吃,这个你根本不用关心,程序运行的时候狗怎么吃,猫怎么吃自然就分开了。自己写例子吧
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
您可能需要的服务
百度律临官方认证律师咨询
平均3分钟响应
|
问题解决率99%
|
24小时在线
立即免费咨询律师
16687人正在获得一对一解答
昆明彩云之南5分钟前提交了问题
沈阳星空之梦5分钟前提交了问题
成都星星点灯5分钟前提交了问题