首页 > 试题广场 >

问这个程序的输出结果。

[单选题]
class Base
{
    public void method()
    {
        System.out.println("Base");
    } 
}
class Son extends Base
{
    public void method()
    {
        System.out.println("Son");
    }
    
    public void methodB()
    {
        System.out.println("SonB");
    }
}
public class Test01
{
    public static void main(String[] args)
    {
        Base base = new Son();
        base.method();
        base.methodB();
    }
}
问这个程序的输出结果。

  • Base SonB
  • Son SonB
  • Base Son SonB
  • 编译不通过
推荐
答案:D
Base base = new Son();
这句new 了一个派生类,赋值给基类,所以下面的操作编译器认为base对象就是Base类型的
Base类中不存在methodB()方法,所以编译不通过

编辑于 2015-02-03 14:57:30 回复(20)
这类多态问题中,无论向上或向下转型,都记住一句话就可以了。
编译看左边,运行看右边。意思编译时候,看左边有没有该方法,运行的时候结果看 new 的对象是谁,就调用的谁。
发表于 2017-04-26 14:05:23 回复(28)
Base base=new Son(); 是多态的表示形式。父类对象调用了子类创建了Son对象。
base调用的method()方法就是调用了子类重写的method()方法。
而此时base还是属于Base对象,base调用methodB()时Base对象里没有这个方法,所以编译不通过。
要想调用的话需要先通过SON son=(SON)base;强制转换,然后用son.methodB()调用就可以了。
发表于 2015-09-02 11:18:06 回复(17)
向上转型,父类的引用无法访问子类独有的方法,
发表于 2016-05-20 10:48:21 回复(10)
多态:父类型的引用可以指向子类型的对象。
与函数重载不同
在方法调用的时候发现,父类里没有的函数,在多态实现的时候不能出现。
父类里如果有调用的是子类的同名方法。


编辑于 2015-12-18 11:13:42 回复(6)
做这类的题目真的是 不知火舞她爸,不知所云。。。。错了几次了,,,,
不能偷懒,还是在网上看了几篇博客(百度搜索:java向上转型和向下转型)
向上转型:父类 = new 子类,无需强转,会丢弃子类的方法,调用自己的方法时,如果子类有覆盖方法,就听子类的。如果调用父类没有的方法,编译会出错。
向下转型:子类 = (子类)父类,要强装,调用子类覆盖的方法,听父类的。
如果 父类 = new 父类; 子类 =(子类)父类;这种情况,编译没有错,运行的时候会提示ClassCastException 错误,
如果 父类 = new 子类;子类 =(子类)父类;这种情况,编译和运行都没有错。
编辑于 2017-09-18 11:39:33 回复(5)
在Java的继承设计方式中,模板设计模式就是继承的一个实用点。模板设计模式可以让我们关注接口、超类这些抽象层次比较高、变动比较少的类别,而不用去关心具体的实现和子类别(这样我们会混乱的)。但是在使用当中也需要注意到,所谓使用模板方法,那么就是使用父类中已经定义了的模板函数,如果父类当中没有定义的模板函数,是无法使用的。
从java编译和运行时的原理角度上看: Base 是声明类型, Son是运行时类型。我们需要根据编译期声明类型、运行时类型的特点分析。
我们知道,Son是具有methodB的方法的,但是声明类型是Base,Base当中没有该方法,编译的时候,编译器会去Base的类当中寻找模板方法,而不会考虑具体运行时的方法,编译器找不到methodB方法,因此报错。
发表于 2016-08-31 11:43:51 回复(2)
这里毕竟是Base base =newSon();以子类的模板赋给父类,但是父类不会继承子类的方法,所以这里只是将子类复写父类的方法放到父类去。
总结: 如果在继承中使用多态:以父类定义的变量去引用子类,该父类变量只能拿回父类中的方法(如果父类方法在子类中重写了那么只能拿到重写后的方法)


我这里也写了另外一个问题:以父类赋值给子类(这种多态方式又是否行得通?)Son son=(Son)new father(); son.test();(test是son重写父类的方法)报以下错误:
总结:当子类定义引用变量去引用父类,这时候需要强制转型,但是已经没有意义了,因为报错了(父类用子类,天经地义;子类反引父类,天理不容)
发表于 2017-01-05 00:23:39 回复(1)
有关对象的上转型对象 Base base = newSon();--》
** base.method();//等同于son调用重写的method()方法
** base.methodB(); //非法,因为methodB()(是子类新加的方法 子类新加的属性也是不可访问的)--》 报错-》D
**插入Son son=new (Son)base //把上转型对象强制转化为子类对象即刻通过编译--》B
发表于 2015-06-04 10:08:00 回复(0)
main 是static的,Son和Base都是非静态的,不能创建实例啊!

No enclosing instance of type TestUp is accessible. Must qualify the allocation with an enclosing instance of type TestUp (e.g. x.new A() where x is an instance of TestUp).
编辑于 2015-08-19 23:57:07 回复(1)
最简单合理的解释:对象上转型,只能用与父类同名的方法,失去了自己新增的方法。
编辑于 2018-04-09 14:46:16 回复(0)
Base base=new Son(); 是多态的表示形式。父类对象调用了子类创建了Son对象。 base调用的method()方法就是调用了子类重写的method()方法。 而此时base还是属于Base对象,base调用methodB()时Base对象里没有这个方法,所以编译不通过。 要想调用的话需要先通过SON son=(SON)base;强制转换,然后用son.methodB()调用就可以了。
发表于 2016-05-07 16:43:35 回复(0)
父类引用指向子类对象。
编译看左边,运行看右边。
父类对像中没有methodB方法,所以编译不通过。父类中含有method方法,编译通过,运行看右边,所以执行的是子类methos方法。
编辑于 2018-01-20 15:35:36 回复(0)
Base base = new Son(); 虽然通过多态,将子类对象赋给了超类变量,但是编译器只将base看成一个Base对象。
发表于 2021-12-22 00:01:28 回复(0)
Base base = new Son() 将子类方法赋给父类,但是父类不会继承子类的方法,这里只是将子类覆写父类的方法放到父类中去;
总结:在继承中使用多态——以父类定义的变量去引用子类,该父类变量只能拿回父类中的方法(如果子类重写了父类的方法,那么只能拿回重写的方法)。
发表于 2017-07-29 09:55:34 回复(0)
父类的引用指向子类时,虚拟机还是将base对象当做父类来看待,所以不能调用子类的新方法。
发表于 2017-04-12 17:00:31 回复(0)
Base base = newSon();  //创建一个Base类型的引用, 指向一个Son类型的对象.
base.method();   //base类型对象中存在method方法, 编译通过.
base.methodB(); //base类型对象中不存在methodB方法, 编译不通过.

编辑于 2016-10-06 10:12:29 回复(0)
答案 D:第27行, 编译不过,因为Base没有methodB方法。
发表于 2015-10-05 08:52:01 回复(0)
B  属于java多态性,运行时base为Son类的实例
发表于 2015-01-04 09:22:03 回复(1)
父类引用不能访问子类独有方法
发表于 2022-07-19 10:45:25 回复(0)
编译不通过,静态绑定,父类没有methodB
发表于 2022-03-21 09:53:05 回复(0)