public class testA {
public static void main(String args[]) {
test1 t3 = new test2();
System.out.println(t3.a);
System.out.println(t3.getA());
}
}
class test1 {
String a = "aaaa";
public String getA() {
return a;
}
test1() {
System.out.println(a);
}
}
class test2 extends test1{
String a = "bbbb";
public String getA() {
return a;
}
test2() {
System.out.println(a);
}
}
不明白输出结果,为什么t3.a是aaaa,而t3.getA()是bbbb,请大侠们帮解释一下。

解决方案 »

  1.   

    由于JAVA 在方法调用时候支持多态(对于方法)
    所以,调用t3.getA()时候,调用的是子类版本的getA()方法,也就是test2中定义的getA()方法,所以显示,bbb
    但是,千万注意,变量的取值只和声明它的类型有关系,变量不支持多态,你在main中写,test1 t3 = new test2(); 所以,t3.a实际上采用的一定是t1中定义的a 的值,无论等号后面是什么。
    所以,t3.a显示的是aaaa
      

  2.   

    属性是不override的,而方法才有override所以你调用父类的属性,拿到的是父类的aaaa
    但你调用父类的方法,其已被子类override,而对象自身又是子类 test2,所以调用的是子类的getA,当然使用的也是子类的 bbbb
      

  3.   

    为什么我编译后出现打印两次呢??
    像这样: aaaa
     bbbb
     aaaa
     bbbb
      

  4.   

    t3。a由于是test2继承test1,先去父类找属性a  为aaaa
    t3.getA()子类重写了父类的getA()方法,new的是子类,所以调用子类方法 为bbbb
      

  5.   

    因为初始化语句 
    test1 t3 = new test2();
    先调用了父类的构造,后调用了子类的构造函数。。
      

  6.   

    public class testA { 
    public static void main(String args[]) { 
    test1 t3 = new test2(); 
    System.out.println(t3.a); 
    System.out.println(t3.getA()); 


    class test1 { 
    String a = "aaaa"; 
    public String getA() { 
    return a; 

    test1() { 
      System.out.println(a); 

    } class test2 extends test1{ 
        String a = "bbbb"; 
        public String getA() { 
        return a; 

    test2() { 
    System.out.println(a); 


    不明白输出结果,为什么t3.a是aaaa,而t3.getA()是bbbb,请大侠们帮解释一下。
      

  7.   

    属性是不override的,而方法才有override