下面是很代码
class A
{
private String name;
A a;
A(String s)
{
this.name= s;
System.out.println("object created");
}
}class B extends A
{
B(String s)
{
super(s);
this.a= this;
}
}public class Main {
    public static void main(String[] args) {
        B b= new B("test");
    }
}
在B的构造函数中a分明是属于A类,为什么可以把属于B类的this赋值给a,不是类型不匹配吗,但程序运行没有问题,请哪位高手帮我解释一下,非常感谢

解决方案 »

  1.   

    java中有两种绑定,静态绑定和动态绑定。变量用的是静态绑定,就是说在编译的时候已经绑定好了。而方法是在运行时去绑定的。换句话说就是在.java文件编译成.class文件的时候变量的值已经定死了。所以B类中的变量a静态绑定了父类A中的a.
    静态绑定:变量和静态方法。 
    动态绑定:实例方法。
      

  2.   

    A a; 1 这个不是私有方法,所以肯定可以赋值2 this是B,而且B是A的子类,当然可以赋值给A子类可以当成父类来用。这是继承的基本原则!
      

  3.   

    楼主一定要注意属性的访问权限,
    这里:private String name; 
    A a; 
    可见name在子类中无法访问。
    a为默认访问权限,在同个包下都可以访问。
    B类继承A类之后,
    this.a= this;
    这句代码:可以理解为
    B.a=B;
    因为B继承自A,a又为A类型,所以可以这么写
      

  4.   

    this就是当前类的引用,表示B,而this.a表示B的属性a,这个a是从父类A继承而来的,是类A的一个实例,相当于把子类赋给父类,这就是java中的向上转型
      

  5.   

    Java的替换原则啊,所有父类出现的地方子类都可以出现啊,即父类变量引用子类对象,或子类对像当作父类对象来使用,简称多态啊
      

  6.   

    继承,子类继承了父类,当你new一个子类对象时,这个对象包括父区的member属性和方法,子类的member属性和方法
    this.a = this,这时把子类对象的首地址赋值给父类引用变量。 父类名 引用变量名 = new 子构造名();这句话用处很广,继承中、以及以后要学的抽象类、接口都得这样。
      

  7.   

    继承的基本特性:
    1. 子类包括了父类中的所有成员,而且a 变量非private,所以this.a成立。
    2. 父类的引用变量可以被所有从父类派生的子类的引用赋值。所以属于B类的this可以赋值给a.