多态
概念:多态是指同一种行为具有多个不同的表现形式或形态的能力。在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{
@Override
public void shout(){
System.out.println("小猫喵喵喵~~~");
}
}
class Dog extends Animal{
@Override
public 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{
@Override
public void use() {
System.out.println("鼠标:点击");
}
}
class KeyBoard implements IUSB{
@Override
public void use() {
System.out.println("键盘:输入数据");
}
}
class Disk implements IUSB{
@Override
public 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);
}
}
注意:
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时就确定了,不能改变
- 运行类型是可以变化的
- 编译类型看=左边,运行类型看=右边
多态优缺点
优点:
- 消除类型之间的耦合。
- 可以使用基类类型的指针或引用指向任何子类类型的对象。
- 可以使用基类的引用或指针调用重写的方法。
- 可以方便地更改子类,添加新的子类。
缺点:
- 不能使用基类的引用或指针直接访问子类的特有成员或方法。
- 不能在编译时确定对象的类型,因此不能访问子类的特有方法。