public class Test { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
 B b=new B(); 
         b.bb();
}}
class A{ 
 String  a="a";
     public void visit(){ 
    System.out.println(this.a);
         System.out.println(this.getClass()); 
     } 

class B extends A{ 
       String a = "b";
     public void bb(){ 
         visit(); 
     }    
}最后答案输出的是 a
                   class B也就是说this指代的是当前对象是没有错的,在这里面this指的是B的实例,但是为什么this.a却输出的是其父类A中的属性a的值呢? 这种是多态么?能给说明一下么?

解决方案 »

  1.   

    因为你打印的时候是在父类里面打印的,所以它的this是指类的本身,也就是a="a",如果你在类B里面打印a的话应该就会是a="b"了。
      

  2.   

    this指的是本类,所以要区别父类和子类。
      

  3.   

    第一个输出a是因为class B 没有覆盖 class A 的visit()方法,所以在执行的时候是执行super.visit()
    第二个输出class B 是因为getClass()方法是不能被子类覆盖的。所以执行this.getClass()就是执行super.getClass(),得到的是子类。如果想得到父类,应该用this.getClass().getSuperclass()
      

  4.   


    所以执行this.getClass()就是执行super.getClass(),得到的是子类 这句话不能理解,怎么会是执行的super.getClass()?
      

  5.   


    您的意思是这个this指的是父类么?那么this.getClass打印出来的为什么会是子类?
      

  6.   

    getClass()是final的不允许子类覆盖,所以子类只能继承父类的getClass()。this.getClass()是返回运行时对象的类型
      

  7.   

    其实都是指的当前的,B中没有visit方法,所以会调用父类A中的,在父类A中通过this.a当然获取的是A中的a属性,由于B中的a是另外一个a变量了,并不是父类的,所以父类中的a并没有被覆盖,所以打印的是a,但是this.getClass()是获取当前对象的class,我们真是new的对象是B,所以获取出来的的class当然也应该是B的class了,如果你把B中的代码这样修改一下,就能看到效果:
    class B extends A {
    {
    a = "b";
    }
    public void bb() {
    visit();
    }
    }
      

  8.   

    a不是public的,所以A里的a和B里的a是两个变量this就是指内存中的那个对象,是B就是B,没什么商量吧
      

  9.   

    在Java中只有new这个关键字可以生成一个新的对象,this引用的就是当前的新对象,正如楼主们所说,两个a变量没有覆盖关系,在内存中会单独开辟变量空间,this.a是引用的父类中的那个a变量。所以最终出现打印的结果
      

  10.   


    跟a是不是public有啥关系?
    更不是啥覆盖继承的问题,所有类都默认继承Object,而是不是从父类来继承Object
    因此每个类都有自己的Object.getClass()方法this引用的是本类对象,查看Object.getClass方法可以看到:返回此 Object 的运行时类。运行时类,这个词很形象。所以不是this没理解到位,是getClass没理解到位。
      

  11.   

    A类里的a是private的,所以,A的子类根本就不知道有a这么个变量存在的.