A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马薛有义 黑马帝   /  2011-7-22 11:10  /  3550 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
}
}

谁能帮我解释解释这个程序的结果,为什么?

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1

查看全部评分

4 个回复

倒序浏览
黑马网友  发表于 2011-7-22 15:01:15
沙发
多态针对的是方法不是属性
回复 使用道具 举报
黑马网友  发表于 2011-7-22 16:10:20
藤椅
这是多态问题,具体到这个问题你要知道:子类中有一个隐藏的引用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()方法。

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-22 16:23:37
板凳
二楼…多态针对的是方法,不是属性。至于父类引用指向对象,就好比叫你为人。面向接口编程常用…

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 继续努力哦!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-24 15:58:15
报纸
这就是多态,当子类赋值给一个父类变量时,子类会向上转型为父类,子类的方法会隐藏父类的方法[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()

评分

参与人数 1技术分 +2 收起 理由
小龙 + 2 不错,不错!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马