class A{
String str="A";
{
//System.out.println("nimama");
}
A(){
init();
}
public void init(){
System.out.println("str");
}
}
class B extends A{
String str="B";
B(){
super();//init();
}
public void init(){
System.out.println(str);
}
  public static void main(String[] args){
  
      A c=new B();
      System.out.println(c.str);
  }}

解决方案 »

  1.   

    “A c=new B()”这个基本概念还没弄清楚,真不知道用什么方式来解释第一个问题
      

  2.   

    知道怎么调试吧,你在A c = new B()处设断点,然后一步一步跟踪,相信你会懂的。
      

  3.   

    "A c=new B()"这句代码的意思是子类的对象指向父类的引用,是多态的特征。
      

  4.   

    试着解释一下这个结果:
    首先构造B的时候会自动调用其父类的构造方法,所以
    B(){
    super();
    }
    可以省略,不影响结果
    当构造B时会先构造其父类A,所以new B()之前会把A new出来
    第一步生成A的成员变量然后赋值,第二步执行A的构造方法,就是调用init()方法,因为调用方法的时候会先检查这个方法是否有重写,会发现B重写了这个方法,所以实际上调用的是B的init()方法,而B的init方法打印的是this.str,这个时候B.str还没有赋值所以打印的是null。
      

  5.   

    输出null的原因是调用B的构造函数时,由于B由A继承,先调用A的构造函数,其中调用了init()函数,而B类的数据成员 str尚未初始化,此时调用init函数输出B类的成员str时为null。
    第二个问题,多态指多各类可以定义不同的同名方法(名称相同,功能不同),但数据成员应依据类名
      

  6.   

    A c =new B();有继承,有重写,有父类引用指向子类对象,所以有多态存在。因此,执行super();时,实际掉用了B了init()方法,而我们知道,super()是为了完成父类(A)的构造,而此时子类B独有的属性根本没有进行初始化,所以你要用B的str当然输出为空。
    也不知道说清楚没。。你试着画一下内存图就会很明白了
      

  7.   

    A c = new B();example:
    水果 a = new 桔子();不再解释