动态绑定:
运行时根据对象的类型进行绑定;以便在运行时能判断对象的类型,从而调用正确的方法。
对象工厂实例:
class Shape {
public void draw() {//画方法
}
public void erase() {//擦除方法
}
}
class Circle extends Shape {//圆形
@Override
public void draw() { System.out.println("画圆形"); }
@Override
public void erase() { System.out.println("擦除圆形"); }
}
class Triangle extends Shape {//三角形
@Override
public void draw() { System.out.println("画三角形"); }
@Override
public void erase() { System.out.println("擦三角形"); }
}
class Square extends Shape {//正方形
@Override
public void draw() { System.out.println("画方形"); }
@Override
public void erase() { System.out.println("擦方形"); }
}
class RandomShapeGenerator {
private Random random=new Random(47);
public Shape next(){//对象选择器,通过switch循环,传入指定的数组便能创建相应的对象
switch (random.nextInt(3)){
default:
case 0: return new Circle();
case 1: return new Triangle();
case 2:return new Square();
}
}
}
public class Shapes{
public static void main(String[] args) {
RandomShapeGenerator gen=new RandomShapeGenerator();
Shape[] s =new Shape[9];
for(int i=0;i<s.length;i++){
s[i]=gen.next();
}
for (Shape shp:s) {
shp.draw();
}
}
}
多态只存在于普通方法中对于静态方法,是不具有多态性的
package com.zx.test08;
class StaticSupe{
public static String staticSupeGet(){
return "staticSuperGet";
}
public String dynamSupeGet(){
return "dynamSupeGet()";
}
}
class StaticSub extends StaticSupe{
public static String staticSubGet(){
return "staticSubGet=====";
}
public String dynamSubGet(){
return "dynamSubGet()==========";
}
}
public class StaticPolymorphism {
public static void main(String[] args) {
StaticSupe sup = new StaticSub();
System.out.println(sup.dynamSupeGet());
System.out.println(sup.staticSupeGet());
}
}
注意:基类中private修饰的方法不能被子类覆盖,虽然编译器不会报错,但会和我们所要的结果不同,所说我们要在子类中对于基类的private方法要采用不用的方法名去命名,以便我门可以区分。