多态
概念:多态是指同一种行为具有多个不同的表现形式或形态的能力。在Java中,多态是指一个对象的实际类型可以是其父类或接口类型,但在运行时会根据其实际类型来调用相应的方法。是面向对象的第三大特征,建立于封装和继承之上。
【多】:表示多种
【态】:表示状态
多态的实现方式
方法的重载体现多态
class B{public void say(){System.out.println("B(父类)类的say()方法被调用");}
}
class A extends B{public int sum(int n1,int n2){return n1 + n2;}public int sum(int n1,int n2,int n3){return n1 + n2 + n3;}public void say(){System.out.println("A(子类)的say()方法被调用");}
}
public class Test01{public static void main(String[] args){//方法重载体现多态A a = new A();//传入不同的参数就会调用不同的sum方法,体现多态System.out.println(a.sum(10,20));System.out.println(a.sum(10,20,30));}
}
方法的重写体现多态
class B{public void say(){System.out.println("B(父类)类的say()方法被调用");}
}
class A extends B{public int sum(int n1,int n2){return n1 + n2;}public int sum(int n1,int n2,int n3){return n1 + n2 + n3;}public void say(){System.out.println("A(子类)的say()方法被调用");}
}
public class Test01{public static void main(String[] args){//方法重写体现多态A a = new A();B b = new B();//对象不同,调用的方法不同a.say();b.say();}
}
对象的多态(核心)
class Animal{public void shout(){System.out.println("Animal大声叫");}
}class Cat extends Animal{@Overridepublic void shout(){System.out.println("小猫喵喵喵~~~");}
}class Dog extends Animal{@Overridepublic void shout(){System.out.println("小狗汪汪汪~~~");}
}public class Test02{public static void main(String[] args){//对象多态Animal animal = new Dog();//运行时,animal的运行类型为Dog,因此调用的是Dog的shout方法animal.shout();//输出--小狗汪汪汪~~~animal = new Cat();animal.shout();//输出--小猫喵喵喵~~~ }
}
接口的多态
interface IUSB {public void use();
}class Mouse implements IUSB{@Overridepublic void use() {System.out.println("鼠标:点击");}
}class KeyBoard implements IUSB{@Overridepublic void use() {System.out.println("键盘:输入数据");}
}class Disk implements IUSB{@Overridepublic void use() {System.out.println("硬盘:文件上传下载");}
}class Computer {public void connection(IUSB usb){usb.use();}
}public class Test01 {public static void main(String[] args) {Computer computer = new Computer();//接口的多态:实现类的对象指向接口的引用//接口的引用中存储的是实现类对象在堆中的地址IUSB usb = new KeyBoard();computer.connection(usb); }
}
注意:
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时就确定了,不能改变
- 运行类型是可以变化的
- 编译类型看=左边,运行类型看=右边
多态优缺点
优点:
- 消除类型之间的耦合。
- 可以使用基类类型的指针或引用指向任何子类类型的对象。
- 可以使用基类的引用或指针调用重写的方法。
- 可以方便地更改子类,添加新的子类。
缺点:
- 不能使用基类的引用或指针直接访问子类的特有成员或方法。
- 不能在编译时确定对象的类型,因此不能访问子类的特有方法。