class A{
String c=new String(); 
String a="class A";
}
class B extends A{
String c=new String("abc");
String b="calss B";
}
public class Exam3_17{
public static void main(String args[]){
A a1=new A();
B b2=new B();
b2.c="asd";
    a1=b2;
    System.out.println(a1.c);
    System.out.println(b2.c);
}
}
此题中啊a1.c为何不输出“asd”?

解决方案 »

  1.   

    变量和方法还不太一样
    如果子类的方法和父类的一样,则调用子类的方法
    如果子类的变量名和父类的一样,则取决于该对象的声明类型而非实际类型
    class A
    {
       char a='A';
    }
    class B
    {
       String a="B";
       public static void main(String[] args)
       {
           A a=new B();
           System.out.println(a.a);
       }
    }
      

  2.   

    修正
    class B extends A
      

  3.   

    不明白。
    将程序改成
    A a1=new B();
    B b2=new B();
    后,输出的数据与现在一样,也就是说,a1调用的仍然是父类的变量
      

  4.   

    class A{
    String c=new String(); 
    String a="class A";
    }这是private....class A{
    private String c=new String(); 
    private String a="class A";
    }现在想通了没有..全部是私有变量
    所以你名字再怎么一样,值也不会影响的
      

  5.   

    如果子类的方法和父类的一样,则调用子类的方法
    如果子类的变量名和父类的一样,则取决于该对象的声明类型而非实际类型
    可以把a1.c 和 b2.c 改成 a1.getC() 与 b2.getC()
    就可以理解以上两句话的意思了
      

  6.   

    不是没输出,而是为空,
    class A{
    String c=new String();  //默认为NULL 
    String a="class A";
    }A a1=new A();
    B b2=new B();
    b2.c="asd";
        a1=b2; // a1指向b2变量的引用.a1内部变量本身的引用并没有改变,
        System.out.println(a1.c);
        System.out.println(b2.c);
      

  7.   

    string不能直接用=吧
    我改了下你的程序
    可以运行了
    =====
    class A
    {
    String c=new String(); 
    String a="class A";
    }
    class B extends A
    {
    String c=new String("abc");
    String b="calss B";
    }
    public class hyx
    {
    public static void main(String args[])
    {
    System.out.println("adf");
      A a1=new A();
    B b2=new B();
    b2.c="asd";
        a1.equals(b2);  //调用equals方法
          System.out.println(a1.c);
           System.out.println(b2.c); 
    }
    }可以输入asd
      

  8.   

    原因在这一句上面
    b2.c="asd";
    这句的作用相当于是给c创建了一个新的对象new String()指向不同地址,所以没有修改原来B中c的地址,所以输出是不对的
    SCJP中常见的题目
      

  9.   

    相当于A a1 = new B();
    现在你知道是怎么回事了吧
    变量是使用类型变量,方法是使用实体方法
      

  10.   

    由于声明的类型限制,即使a1对象实际是B类型,a1也访问不到B类中的c.也就是说你能访问到的接口与声明的类型有关.
      

  11.   

    Class B中隐藏了Class A中的c,b变成c`,b`(隐藏,依然存在)
    b2.c="asd";//改了B中的c,c`没变
    a1=b2;//所以a1.c依然是b2中的c`,此处为空
      

  12.   

    Class a1=new Class A();
    已经声明了a1为Class A 类型
    虽然a1=b2,但是子类的变量名和父类的一样,则取决于该对象的声明类型而非实际类型
    所以打出的是空
      

  13.   

    java的属性不存在覆盖的概念,即a.c就是b的super.c,而不是b.c
    在你的public class Exam3_17的main方法中加一句b.super.c="asd"试试
      

  14.   

    B extends A后,B就有两个c的属性,一个是父类的c属性,一个是自己的c属性,因此当用父类的引用来调用时,只会调用到父类的c属性,子类的c属性对于父类引用是不可见的,如果要调用子类的c属性,打印"asd"这个串,只要把打印的那个语句:System.out.println(a1.c) ,
    改为:System.out.println(((B)a1).c)。
      

  15.   

    a1=b1;表示把父类当成子类看,由于java中类的属性没有多态,  所以调用a1.c的时候输出的还是父类的属性c
      

  16.   

    多态的问题.a1还是A的引用,只会引用A中的属性和方法,虽然赋了子类B的对象给它.class A{
    String c=new String(); 
    String a="class A";
    }
    class B extends A{
    String c=new String("abc");
    String b="calss B";
    }
    public class Exam3_17{
    public static void main(String args[]){
    A a1=new A();
    B b2=new B();
    b2.c="asd";
        a1=b2;
    System.out.println(" a1 is "+a1.getClass().getName());
        System.out.println(" a1.a is "+a1.a );
    //System.out.println(" a1.b is "+a1.b );
        System.out.println(" a1.c is "+a1.c);
        System.out.println(" b2.c is "+b2.c);
    }
    }输出:
     a1 is B
     a1.a is class A
     a1.c is
     b2.c is asd
      

  17.   

    a1是A类的引用,虽然通过a1=b2使a1指向了其子类对象,但其只能访问子类从A类继承来的属性和方法~~~~~~~~~