1.多态
1.1 相关知识
软件设计六大原则:
1.单一职责原则
2.里式替换原则
3.依赖倒置原则
4.接口隔离原则
5.迪米特法则
6.开闭原则
1.2 多态是什么
多态:父类引用指向子类对象
父类引用:使用父类声明的引用型变量
指向:就是通过这个变量可以找到谁
子类对象:使用子类创建的对象
使用父类的变量可以找到子类的对象
多态的几种形式:
1.直接多态 Animal a = new Animal() ;
2.形参和实参 方法声明时,传入的参数为父类类型,而方法调用的时候,传入的参数是子类对象
3.返回值: 返回值类型是父类类型,但是返回的对象时子类对象
1.3. 缺点
多态缺点: 丢失了子类特有的属性
使用多态进行嗲用:
1.如果父类没有,不管子类有没有,都报错,因为丢失子类特有属性
2.如果父类有,子类没有,使用父类的,因为继承
3.如果父类有,子类也有,除了成员方法执行子类,其他都执行父类(因为只有成员方法可以重写)
1.4 怎么用
1.5 优点
高内聚,低耦合,方便代码的扩展
1.6 隐秘多态
package day_04._01_Polymorphic;
/**
* 比较隐秘的多态
*
* 总结 : 通过子类,调用了父类的方法的时候,父类的这个方法的上下文环境,就是多态环境(属于父类空间,子类对象)
*
* @author 天亮教育-帅气多汁你泽哥
* @Date 2021年10月14日 上午11:04:10
*/
public class Poly_04 {
public static void main(String[] args) {
Sup sup = new Sub();
// 2
System.out.println(sup.i);
// 子类
sup.m2();
Sub sub = new Sub();
// 3
// System.out.println(sub.i);
// 子类
// sub.m2();
sub.m1();
}
}
class Sup {
int i = 2;
public void m1() {
// this : 保存当前类对象的内存地址
// 当前类 : this出现在哪个类,哪个类就是当前类
// 并且 this是第一个成员变量,既然是变量,肯定有数据类型
// 那么this的类型是什么的时候可以存储当前类对象的地址? 1 当前类类型(Sup) 2 父类类型
// 如果是父类类型,说明发生了多态,会丢失特有属性,但是this可以调用当前类中所有的属性,所以this是当前类类型
// Sup this;
// this : 用在成员方法中,哪个对象调用了这个方法,this就指向哪个对象
// 在这里 m1是sub对象调用的,所以this 就指向 sub对象
// 而 sub是继承了Sup的
// 所以 等于是这样 Sup this = sub; Sub sub = new Sub(); 所以 Sup this = new Sub();
// 所以在这里 this 发生了多态
System.out.println(this.i);
this.m2();
}
public void m2() {
System.out.println("父类的m2");
}
}
class Sub extends Sup {
int i = 3;
public void m2() {
System.out.println("子类的m2");
}
}
1.7 Instanceof
多态又叫向上转型
子类到父类是 向上转型,而父类到子类是 向下转型
为什么要向下转型
因为多态的缺点是丢失了子类特有的属性,所以想要调用子类特有属性的时候,需要转换为对应的子类对象
2.抽象 abstract
2.1 抽象类又来表示设计中得到的抽象概念
abstract是一个修饰符,和final互斥
修饰的类是抽象类,只能被继承,无法创建对象
修饰的方法是抽象方法,并且该方法没有方法体
抽象方法一定在抽象类中,但是抽象类中不一定有抽象方法
抽象类虽然不能创造对象,但是有构造方法,因为他的子类对象在创建的时候还需要用
一个非抽象类,在继承抽象类时,需要实现所有的抽象方法
一个抽象类,在继承抽象类时,可以实现0~N个方法
3.接口 interface
interface:定义接口的关键字 语法: 权限修饰符 interface 接口名 {类体}
接口主要为了解决java中类只能单继承的问题,可以继承多个接口
接口是一种特殊的类
1.8之前 接口是完全抽象的,只能有抽象方法和常量
1.8开始 接口中允许出现默认方法和静态方法
怎么用
注意
如果接口和抽象类都能完成一件事,那么优先使用接口,因为接口可以多继承,但是类和类只能单继承
优点
当一个功能拥有多种不同实现的时候,就需要依赖接口编程,此时可以降低耦合度
如果说一个功能,只拥抱一种变化,就不需要使用接口了
还可以使用多态