一 多态
1 相关知识
2 是什么
3 缺点
4 怎么用
5 优点
package day_04._01_Polymorphic;
/**
* 多态好处
*
* 简单来说 : 高内聚,低耦合
*
* @author 天亮教育-帅气多汁你泽哥
* @Date 2021年10月14日 上午10:51:06
*/
public class Poly_02 {
public static void main(String[] args) {
Cat_01 c = new Cat_01();
eat(c);
Dog_01 d = new Dog_01();
eat(d);
Pig p = new Pig();
eat(p);
}
// 需求 : 要求能够接收所有的动物对象,并调用对象的eat方法
// 这种写法,后续想要养别的宠物,这里源码需要改动
// public static void eat(Cat_01 c) {
// c.eat();
// }
// public static void eat(Dog_01 d) {
// d.eat();
// }
// 多态写法,只要是动物的子类,都可以接收,所以后续想养其他宠物,这里也不需要更改代码,拥抱多种变化
public static void eat(Animal_01 a) {
a.eat();
}
}
class Animal_01 {
public void eat() {
System.out.println("动物吃东西");
}
}
class Cat_01 extends Animal_01 {
public void eat() {
System.out.println("猫吃鱼");
}
}
class Dog_01 extends Animal_01 {
public void eat() {
System.out.println("狗吃肉");
}
}
class Pig extends Animal_01 {
@Override
public void eat() {
System.out.println("吃白菜");
}
}
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");
}
}
7 Instanceof
二 Abstract
1 是什么
2 怎么用
3 注意
Abstract和final 不能同时存在
三 Interface
1 是什么
2 怎么用
3 注意
如果接口和抽象类都能完成一件事,那么优先使用接口
因为类和接口是多实现,类和类是单继承
这样还能保留类的继承
4 优点
当一个功能拥有多种不同实现的时候,就需要依赖接口编程,此时可以降低耦合度
如果说一个功能,只拥抱一种变化,就不需要使用接口了
还可以使用多态