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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @♂№‰腊布啊に 中级黑马   /  2013-1-14 14:41  /  1423 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

类之间的继承关系使子类具有父类的所有变量和方法,=> 父类所具有的方法也可以在它所有子类中使用,发给父类的消息也可以发送给子类 => 子类的对象也是父类的对象=>子类的对象既可以做本身的类型,也可以做父类的类型。 呵呵,上述推导公式好像绕口令似的。我们举个例子理解上述概念。举例:

    public class 动物 //动物是父类

    public class 猫 extends 动物 //猫是子类

动物的所有特性在猫中可以使用,发给动物的信息猫也能收到=>猫的对象new 猫();既可以作为本身的类型 猫 a=new 猫(); 也可以作为父类的类型 动物 b = new 猫();这样说理解了吗?如有疑问请访问我们的技术论坛。




  

如果大家明白了的话,我们就可以从上述公式推导出结论,所有的子类都可以作为父类的类型(同一种类型)来对待。像刚才那个动物有很多子类啊,可以有很多对象。动物 a=new 猫();动物 b=new 狗(); 动物 c=new 猪();。这样的将子类型的对象引用转换成父类型的对象引用,叫做上溯造型(upcasting)。


我们再来引伸一下,我们在数组那节课里讲了,数组存放的元素是相同类型的数据,但是上溯造型使得java允许创建不同类型对象的数组。例如:

Employee[] staff = new Employee[3];

staff[0] = new Manager();

staff[1] = new Secretary();

staff[2] = new Employee();

夷?这是怎么回事啊,数组里面不是相同类型吗?对啊,因为Sectetary和Manager是Employee的子类,所以也可以通过上溯造型变成Employee啊。以前我们还学到了所有对象都是从java.lang.Object 继承下来的。如果数组要是 Object型的话 Object[] obj=new Object[];那就是里面放什么对象都行了。因为什么对象都可以是Object型的。


实践:

// java中的多态

class Shape {

  void draw() {}

  void erase() {}

}



//圆形

class Circle extends Shape {

  void draw() {

    System.out.println("Circle.draw()");

  }

  void erase() {

    System.out.println("Circle.erase()");

  }

}




//正方形

class Square extends Shape {

  void draw() {

    System.out.println("Square.draw()");

  }

  void erase() {

    System.out.println("Square.erase()");

  }

}



//三角形

class Triangle extends Shape {

  void draw() {

    System.out.println("Triangle.draw()");

  }

  void erase() {

    System.out.println("Triangle.erase()");

  }

}



public class Shapes {

  public static Shape randShape() {

    switch((int)(Math.random() * 3)) {

      default:

      case 0: return new Circle();

      case 1: return new Square();

      case 2: return new Triangle();

    }

  }



  public static void main(String[] args) {

    Shape[] s = new Shape[9];

    // 向数组里添加类型

    for(int i = 0; i < s.length; i++)

      s[i] = randShape();

    // 用多态的方法调用

    for(int i = 0; i < s.length; i++)

      s[i].draw();

  }

}

2 个回复

倒序浏览
为什么没有技术分啊?急急急
回复 使用道具 举报
王溢君 来自手机 中级黑马 2013-1-16 15:00:23
藤椅
原创的吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马