java多态
大家都知道java有三大特性就是封装,继承和多态 今天我们要说的就是其中的多态
什么是多态
定义
- 多态是面向对象程序设计语言最核心的特征,意味着一个对象有着多重特征,可以在特定的情况下表现不同的状态从而对应不同的属性和方法
实现技术:动态绑定
- 指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
作用
- 消除类型之间的耦合关系
实现多态的必要条件:继承、重写、向上转型
- 继承:多态中必须存再有继承关系的子类和父类
- 重写:子类对父类中某些方法进行重新定义,调用这些方法时会调用子类的方法
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法
只有满足这三个条件是才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为
多态的好处
-
1.可替换性(substitutability):多态对已存在代码具有可替换性
-
2.可扩充性(extensibility):多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能
-
3.接口性(interface-ability):多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的
-
4.灵活性(flexibility):它在应用中体现了灵活多样的操作,提高了使用效率
-
5.简化性(simplicity):多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要
多态的实现方式
- 接口实现
//汽车接口
public interface Car {
//名称
String getName();
//价格
int getPrice();
}
//具体汽车类
public class BMW implements Car {
@Override
public String getName() {
return "BMW";
}
@Override
public int getPrice() {
return 10;
}
}
public class AODI implements Car {
@Override
public String getName() {
return "AODI";
}
@Override
public int getPrice() {
return 5;
}
}
//汽车商店
public class CarShop {
//卖出总价
private Integer saleTotal = 0;
//卖出一辆汽车
public void saleCar(Car car) {
System.out.println("汽车类型 " + car.getName() + " 售价 " + car.getPrice());
saleTotal += car.getPrice();
}
public Integer getSaleTotal() {
return saleTotal;
}
//测试方法:传入不同的具体类型 实现多态
public static void main(String[] args) {
CarShop carShop =new CarShop();
carShop.saleCar(new BMW());
carShop.saleCar(new BMW());
carShop.saleCar(new AODI());
System.out.println("销售总金额 " +carShop.getSaleTotal());
}
}
输出结果:
汽车类型 BMW 售价 10
汽车类型 BMW 售价 10
汽车类型 AODI 售价 5
销售总金额 25
- 继承父类进行方法重写
public class Animal {
public void eat() {
System.out.println("吃东西+++++++++++");
}
public void drink(){
System.out.println("喝东西+++++++++++");
}
}
public class Dog extends Animal {
public void run() {
System.out.println("dog 跑++++++++");
}
//重写父类方法,实现多态
public void eat() {
System.out.println("dog 吃东西++++++++ ");
}
public static void main(String[] args) {
Dog dog =new Dog();
//子类重写方法
dog.eat();
//子类未重写方法
dog.drink();
}
}
- 同一个类中进行方法重载
public class Overloading {
public int test(){
System.out.println("test1");
return 1;
}
public void test(int a){
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}
public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}
public static void main(String[] args){
Overloading o = new Overloading();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}
输出结果:
test1
1
test2
test3
returntest3
test4
returntest4