public class Text3 extends Texttwo{
public void output(){
System.out.println("Three");
}
}
public class Text4 extends Text3{
public void output2(){
System.out.println("four");
}
}
public class TextOne {
public static void main(String[] args) {
Text3 a=new Text4();
a.output2();
}
}
这个程序是不通过编译的,是因为一定要和父类一样的方法才可以调用吗?这里该怎么理解,求指教!!!
class Father{
public int s=20;
public void prints(){
System.out.println("Hello Father " + s);
}
}
public class HelloWorld extends Father {
int s=30, t=40;
public void prints(){
......
答案就在这里:Java继承和多态
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。
a 是指向 Text3 类型的一个变量。
你好,a是text3类的实例化对象。只能操作Text3类的方法。要想访问子类text4的方法,必须是父类(这里是text3)定义一个方法,然后子类(text4)进行重写(override),才能表现出多态的。
Text3是Text4的父类,你把Text4的实例赋值给Text3的引用,这里发生了向上转型。而Text4中的方法Text3中并没有,你的错误在于父类不能调用子类特有的方法。
首先,我们假设你那么写是可以的。
那么意味着编译器必须能够从你的代码上推定出a一定是Test4。在你的代码中似乎可以这么认为。
看这样的代码
Text3 a=new Text4();
Scanner scanner=new Scanner(System.in);
int n = scanner.nextInt();
if (n > 888) a = new Text3();
a.output2();
很明显,在调用a.output2()的时候,我们能肯定a一定是Test4了么?显然不能。
既然a是一个变量,那么它可以随时赋给Test3或者任何Test3的派生类型的对象,而不一定是Test4。编译器为了调用output2,必须在编译阶段推定它的实际类型,才能完成编译,但是Java编译器做不到这一点,明白了么?
但是不能说这么做就是不合适的。如果一种语言是可以在运行时绑定的,比如js、ruby,那么完全可以这么做。
你写的是多态,父类声明赋值子类,此时是向上转型,不能用子类的特有方法
test4继承了test3,4具有3的方法,但创建的是父类对象,子类具有自己的特征,父类对象就无法调用
父类new子类多态
子类new子类继承。
父类new子类多态
子类new 子类继承
因为Text3是Text4的父类,而output2这个方法是子类Text4的特有方法,所以申明为父类Text3的引用a是无法调用output2这个方法的。