java三大特性之多态

Java允许父类对象的变量作为子类对象的变量使用。

eg:    Shape e = new Triangle ();

但通过该变量只能访问父类的方法,子类特有的部分被隐藏。

运行时确定使用父类还是子类的方法。

 eg:    e.draw();

可能得到多种运行结果,可能是Shape类的draw () 方法,也可能是Triangle类重写的draw ()方法,具体的结果依赖于运行时刻 e 所指的对象的类型,而不是编译时刻e的类型。

import java.util.*;

//定义Shape类
class Shape {
  void draw() {}
  void erase() {}
}
//定义Circle类
class Circle extends Shape {
  void draw() {
    System.out.println("Calling Circle.draw()");
  }
  void erase() {
    System.out.println("Calling Circle.erase()");
  }
}
//定义Square类
class Square extends Shape {
  void draw() {
    System.out.println("Calling Square.draw()");
  }
  void erase() {
    System.out.println("Calling Square.erase()");
  }
}
//定义Triangle类
class Triangle extends Shape {
  void draw() {
    System.out.println("Calling Triangle.draw()");
  }
  void erase() {
    System.out.println("Calling Triangle.erase()");
  }
}
//包含main()的测试类
public class Shapes{
  static void drawOneShape(Shape s){
      s.draw();
  }

static void drawShapes(Shape[] ss){ for(int i = 0; i < ss.length; i++){ //ss[i].draw(); drawOneShape(ss[i]); } } public static void main(String[] args) { Random rand = new Random(); Shape[] s = new Shape[9]; for(int i = 0; i < s.length; i++){ switch(rand.nextInt(3)) { case 0: s[i] = new Circle();break; case 1: s[i] = new Square();break; case 2: s[i] = new Triangle();break; } } drawShapes(s); } }

父类弱,子类强,指向父类的引用不能直接按子类引用,必须要强制类型转换后才能作为子类的引用使用。

Instanceof 测试对象类型

Shape   s = new Triangle();

S instanceof  Triangple 结果为true

posted @ 2018-04-14 10:02  风雨长安  阅读(168)  评论(0编辑  收藏  举报
博客