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