一.多态
1.1 相关知识
软件设计六大原则:
1.单一职责原则 : 一个类或一个方法只做一件事,只拥抱一种变化(只有一个事情的变动会引起变动)
2.里氏替换原则∶能使用父类的地方就─定可以使用子类
3.依赖倒置原则 : 底层应该依赖高层,高层不应该依赖底层,实现应该依赖抽象
4.接口隔离原则 : 应该依赖最小接口
5.迪米特法则 : 只和有关系的类进行通信
6.开闭原则 : 扩展开放,修改关闭
1.2 是什么
java中提供了两种多态机制:
1.编译时多态∶是静态的,主要是指方法重载,根据传入不同的参数做出不同的响应
2.运行时多态:是动态的,主要指动态绑定来实现,是我们现在的重点
多态:父类引用指向子类对象 父类引用:就是父类类型创建的引用变量
指向∶就是可以找到谁
子类对象∶子类的实例化对象
通过父类创建的引用类型变量,保存了子类对象的内存地址 父类变量= new子类();
1.3 怎么用
1.直接多态
父类 变量名 = new 子类();
2.形参实参多态
3.返回值多态
public static void main(String[] args) {
//父类 变量名 = new 子类();
Animal a = new Cat();
//形参实参多态
m1(new Cat());
}
public static void m1(Animal a ){
}
public static Animal m20{
//返回值多态
return new Cat();
}
1.4 应用场景与优点
如果一个功能只对应一种实现,就不使用多态 如果一个功能可能有多种实现,一定是多态
class User {
// public void test(Cat cat) {
// cat.eat();
// }
// public void test(Dog dog) {
// dog.eat();
// }
public void test(Animal animal) {
animal.eat();
}
}
class Animal {
public void eat() {
}
}
// 猫
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}
// 狗类
class Dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
}
}
class Pig extends Animal {
public void eat() {
System.out.println("猪拱白菜");
}
}
优点 : 降低耦合度,降低需求变动带来的代码变动风险
1.5 缺点
丢失子类特有的属性(父类没有子类有)
1.6 多态进行属性调用
1.父子类都没有 : 报错 2.父子类都有 : 成员方法执行子类,其他执行父类(父子类都是一个变量a,调用父类的a)(一般是只有方法) 3.父类没有子类有 : 报错,丢失子类特有属性 4.父类有子类没有 : 父类(父类m1,m2方法,子类只有m1方法)
1.7 Instanceof
多态又叫向上转型 强制转换会子类类型,又叫向下转型 必须先发生向上转型,才能发生向下转型
public class Poly_04 {
public static void main(String[] args){
// 多态/向上转型
Animal a = new Cat();
//丢失子类特有属性l
// a.m1();会报错
//强制类型转换为Cat,向下转型
Cat c = (Cat) a;
c.m1();
//java.lang.ClassCastException
Animal a1 = new Animal();
//报错,类型转换异常
// Cat c1 = (Cat)a1;
}
Instanceof:判断该对象是否由某个类实例化而来,可以有效降低向下转型风险
if(a1 instanceof Cat){
Cat c1 = (Cat)a1;
System.outprintIn("是cat");
}else{
System.outprintln("不是cat");}