关于java中的抽象类的this问题,相当复杂

来源:百度知道 编辑:UC知道 时间:2024/05/14 08:27:39
有如上代码
public class test {

/**
* @param args
*/
public test(){

}

public static void main(String[] args) {
// TODO 自动生成方法存根
B b=new C();
C c=new C();
c.b.printMe();
System.out.println(c==c.b);
c.getA().printMe();
b.printMe();
b.b.printMe();

}
}
abstract class A{
public void printMe(){
System.out.println("this is A");
}
}
abstract class B extends A{
B b;
B(){
b=this;
}
public A getA(){
return this;
}
public void printMe(){
System.out.println("this is B");
}
}
class C extends B{
public void printMe(){
System.out.println("this is C");
}
}
运行结果:
this is C
true
this is C
this is C
this is C
我的疑问有下面几点:
1.类B是抽象类,那么在类B中的构造器中的b=this,请问这个this指的是谁?难道是类B的对象吗?可是类B是抽象

你应该找本书仔细研究一下类的多态性.
看你提出的问题你说多态你学的差不多,我看差远了....

上面的例子我不给你讲了,我按我自己理解多态的方式按你的例子给你说一下...

一个程序在内存中有四个区..栈...堆...全局数据区...全局代码区....
在这里全局代码区里放着方法名....
因为C继承B,B继承A.所以
new C()的时候要先new B(),还要先new A()
new A()后,全局代码区先划出一块,,这里有:printMe()
new B()后,有getA()和printMe(),但后一个方法把构造A时方法覆盖了.举例子:父类A的printMe()是内衣,子类B的printMe()是外衣..正常情况下你只能看到外衣,看不到内衣的...但是super可以看到,你先别管,要不你好乱了,你只要记住.不用super的时候..你永远是只能看到外衣,看不到内衣的.
同理.
new C()后,里面还是有getA()和printMe(),但这里,getA()是父类,属于内衣,因为它没有外衣进行覆盖,所以还能看到..printMe()就是C的方法了.因为C时就给它加上外衣了..
所以你明白了.无论你声明哪一级的变量(A,B,C),只要是new C()的话..就只能输出"this is C "(先别想super)
this呢?它就指向new C()的这一块全局代码区.....
b=this.在这个问题上..你说B的构造方法不应该属于类C ......对吧...
this就是new C()时生成的全局代码区...这里会没有B的构造吗?构造方法不是方法吗?我在上面没写而已.其实它也在那里面.

this就是指向了使用本this的方法的对象所在的全局代码区...
多读几遍....这句话.

首先1:
你 B b=new C(); b是B类型的,但是是C类创建的对象,通过对象上传,下传,调用的最终PrintMe()还是C类的

然后2:
还是一样,对象上传了,在调用方法时自然会下传为C类的方法。A派生B,B