黑马程序员技术交流社区

标题: 父类引用指向子类对象? [打印本页]

作者: 黑马薛有义    时间: 2011-7-22 11:10
标题: 父类引用指向子类对象?
public class Test{
public static void main(String[] args){
B b1,b2 = new B();
A a1,a2;
a1=(A)b2;
a2=b2;
System.out.println(a1.s);
a1.show();
System.out.println(a2.s);
a2.show();
b1=(B)a1;
System.out.println(b1.s);
b1.show();
System.out.println(b2.s);
b2.show();
}
}


class A{
String s ="class A";
void show(){
System.out.println(s);
}
}


class B extends A{
String s ="class B";
void show(){
System.out.println(s);
}
}

谁能帮我解释解释这个程序的结果,为什么?
作者: 匿名    时间: 2011-7-22 15:01
多态针对的是方法不是属性
作者: 匿名    时间: 2011-7-22 16:10
这是多态问题,具体到这个问题你要知道:子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数。
B b1,b2 = new B(); //b1,b2指向内存生成B的实例对象。
A a1,a2;                  //生成指向A对象的地址。
a1=(A)b2;              //强制类型转换,使得a1指向b2中包含的A对象。
a2=b2;                   //父类A对象对于子类B对象的引用
System.out.println(a1.s);    //打印出父类对象的s。(类中的属性是没有多态性的。)
a1.show();                            //因为show()被子类重写了,由于多态性,会调用子类show()方法。
System.out.println(a2.s);   //调用父类的对象s   。
a2.show();                            //调用子类的show()方法。
b1=(B)a1;                            //取出a1指向的包含的B对象。
System.out.println(b1.s); //调用子类的对象s。
b1.show();                         //调用子类对象对象的show()方法。
System.out.println(b2.s); //调用子类的对象s。
b2.show();                        //调用子类的show()方法。
作者: 匿名    时间: 2011-7-22 16:23
二楼…多态针对的是方法,不是属性。至于父类引用指向对象,就好比叫你为人。面向接口编程常用…
作者: 匿名    时间: 2011-7-24 15:58
这就是多态,当子类赋值给一个父类变量时,子类会向上转型为父类,子类的方法会隐藏父类的方法[code=java]举个经典的例子吧:
Class Shape{
  public void draw()
  {
  }
}
Class A1 extends Shape
{
  public void draw()
  {
  }
}
Class A2 extends Shape
{
  public void draw()
  {
  }
}[/code]每种形状都可以画,如三角形,正方形等等,但每种形状的画法又不一样
有如下方法
public void drawShape(Shape shape)
{
  shape.draw();
}
则该方法可以根据你实际传进来的对象调用相应的方法
比如:drawShape(new A1()),此时shape指向A1对象,则shape.draw()调用A1中的draw()
  drawShape(new A2()),此时shape指向A2对象, 则shape.draw()调用A2中的draw()

如果A1 A2中没有重写draw(),都将调用Shape中的 draw()




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2