面向对象Ⅱ
多态
相关知识
软件设计六大原则
-
单一职责原则:一个类或一个方法只做一件事,只拥抱一种变化
-
里氏替换原则:能使用父类的地方就一定可以使用子类
-
依赖倒置原则:底层应该是依赖高层,高层不应该依赖底层,实现应该依赖抽象
-
接口隔离原则:应该依赖最小接口
-
迪米特法则:只和有关系的类进行通信
-
开闭原则:扩展开放,修改关闭
概述
多态:多形态
java
中提供了两种多态机制
-
编译时多态:是静态的,主要是指方法重载,根据传入不同的参数做出不同的响应
-
运行时多态:时动态的,主要指动态绑定来实现,是我们现在的重点
多态核心:父类引用指向子类对象
-
父类引用:就是父类类型创建的引用变量
-
指向:就是可以找到谁
-
子类对象:子类的实例化对象
通过父类创建的引用类型变量,保存了子类对象的内存地址
父类 变量 = new
子类();
如何使用
public class Poly_01 {
public static void main(String[] args){
SupClass sup = new SubClass();
sup.m1();
}
}
class SupClass{
public void m1(){
System.out.println("父类m1");
}
}
class SubClass extends SupClass{
@Override
public void m1(){
System.out.println("子类m1");
}
}
应用场景和优点
-
如果一个功能只对应一种实现,就不使用多态
-
如果一个功能可能有多种实现,一定是多态
优点:低耦合,降低需求变动带来的代码变动风险
// 用户类
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("猪拱白菜");
}
}
缺点
丢失子类特有的属性(父类没有子类有,就是特有)
多态进行属性调用
-
父子类都没有:报错
-
父子类都有:成员方法执行子类,其他执行父类
-
父类没有子类有:报错,丢失子类特有属性
-
父类有子类没有:父类
Instanceof
多态又叫向上转型
强制转换回子类类型,又叫向下转型
必须先发生向上转型,才能发生向下转型
抽象
概述
抽象:往往用来表示设计中得出的抽象概念,一般不会有具体的实体表示
比如动物,他只是一个抽象的概念,并没有一个具体的东西叫动物
所以动物就不能代表一个具体的实体,就意味着,动物类,是不能创建对象的,所以,此时动物类,应该定义为抽象类
abstract
:修饰符,表示抽象的
abstract
:修饰类为抽象类,并且抽象类不能创建对象,但是依然有构造方法,用于子类创建对象时调用(super()
)
abstract
修饰的方法为抽象方法,抽象方法没有{} 方法体,用于被子类实现
抽象方法,必须在抽象类中,而抽象类中不一定有抽象方法
如何使用
注意
final
和 abstract
不能同时修饰
因为final
表示最终,不可修改,修饰的类不能被继承,修饰的成员方法不能被覆写
而abstract
表示抽象的,抽象类和抽象方法,就是用于被继承.被子类实现覆写的
接口
概述
接口是解决java
中单继承导致功能变弱问题
一个类只能继承一个类,但是可以实现很多接口
使用接口,也可以发生多态,接口可以看做特殊的抽象类,完全抽象
接口中没有变量,只有常量public
static
final
,并且 psf
可以省略
1.8之前,接口中没有其他方法,只有抽象方法和常量
1.8开始 新特性 接口中可以出现default方法和静态方法
由定义类关键字class
改为interface
如何使用
-
类和类 单继承
extends
-
类和接口 多实现
implements
,多个逗号隔开 -
接口和接口之间 多继承,多个逗号隔开
继承和实现 可以同时存在,先继承,后实现
一个类实现接口后,需要实现所有的抽象方法;一个抽象类实现接口后,可以实现0~N个抽象方法;接口不能创建对象,并且没有构造方法
接口和抽象类的区别
如果某个功能通过抽象类和接口都能完成,优先使用接口
因为类和类是单继承,而类和接口是多实现
我们使用接口的话,会保留类继承,扩展性更强
扩展
Object
Object
是java
提供的根类,所有类都直接或者间接继承Object
Object
中的方法是所有类都有的
Object b = new xxx()
可以发生多态
toString
Equals(重要)
-
equals
设计目的:用于比较两个对象是否相同,默认比较内存地址
-
==
:比较基本类型的时候,比较的是值的大小,而比较引用类型的时候,只能比较内存地址是否相同