什么是多态
同一个引用类型,使用不同的实例而执行不同操作.
父类引用,子类对象
多态的作用
使用父类作为方法形参实现多态
♨️ ♨️ ♨️
注意:使用父类作为形式参数,可以接受子类的对象作为实参.进入到方法之后,该对象仅能当做父类使用,无法访问子类的成员.
到底调用谁的方法
父类对象引用实际指向的对象是谁,就执行谁的方法.
⚠️⚠️⚠️
在C++中,必须使用virtual关键字才能实现多态,Java中,所有方法都是virtual方法.
父类到子类的转换
向下转型(强制类型转换)
判断父类实例的类别
对象 instanceof 类或接口
public class Master {
public void play(Pet pet){
if (pet instanceof Dog) { //如果传入的是狗狗
Dog dog = (Dog) pet;
dog.catchFlyingDisc();
}else if (pet instanceof Penguin) { //如果传入的是企鹅
Penguin pgn = (Penguin) pet;
pgn.swim();
}
}
}
Object类
Object类是Java中所有类的父亲
Object类的方法
和C++必须使用末班不同,Java中不知道类型的对象都可以用Object类来表示.
- getClass()方法
getClass()方法是多态方法返回的是实际对象的类型
getClass()方法的返回值是Class类型,Class类型也继承自Object
getClass()方法是finial方法,不能在子类中重写 - toString()方法
在System.out.println()中直接打印对象时,实际上是调用了对象的toString()方法
如果不在子类中重写toString()方法,则直接调用Object对象的实现:
public class Object {
public String toString() {
getClass().getname() + “@”+Integer.toHexString(hashCode());
}
}
为了调试方便,自定义类建议都重写toString()方法,并且当类更新之后,记得同步更新toString()方法
- equals()方法
回忆String类:
用于判断两个对象是不是同一个对象
equals()方法用于判断两个对象是否具有相同的值
❗❗❗
如果在子类中不重写Object类的equals()方法,则equals()方法和"=="完成的功能是一样的!!
public class Object {
public boolean equals(Object obj) {
return this == obj;
}
}
自定义类的时候,想想对象需不需要比较,如果是,则要重写equals()方法
- clone()方法
可以创建本对象的复制品
复制出的对象是一个新对象
复制出的对象含有现有对象的值,而不是初始值
clone法为protected,在非子类方法中不能直接调用
使用clone()方法比new一个对象再复制要快
clone()方法的使用还涉及到其他的知识,现在只要记住,该方法就是将一个对象复制了一份,对复制后的对象进行修改,不会影响原对象. - hashCode()方法
它的实现是根据本地机器相关的
equals()相等的两个对象,hashCode()一定相等
equals()不相等的两个对象,却并不能证明他们的hashCode()不相等
Java中的很多类都重写了hashCode()方法,例如,String, Integer, Double等,他们都有自己内部实际存储的数据来计算hashCode - finalize()方法
1.当一个对象在程序中不能再被使用,就成为一个无用对象(没有任何引用指向该对象)
2.Java虚拟机会周期性地释放无用对象,称为垃圾回收(Garbage Collection)
3.在对象被垃圾回收的时候,垃圾回收器(Garbage Collector)会先调用对象的finalize()方法,然后再销毁对象
4.无法知道垃圾回收什么时候执行,可以使用System.gc()方法来建议虚拟机进行垃圾回收
⏳⏳⏳
垃圾回收
对象的引用指向其他对象,则原对象称为垃圾对象
Dog dog = new dog();
dog = null;
匿名对象,在产生之后立马称为垃圾对象
new Dog();
在函数中的局部对象,退出函数之后编程垃圾对象
public void function() {
Dog dog = new Dog();
dog.print();
}
小结
多态可以减少类中代码量,可以提高代码的可扩展性和可维护性
向上转型——子类转换为父类,自动进行类型转换
向下转型——父类转换为子类,结合instanceof运算符进行强制类型转换
实现多态的两种方式
使用父类作为方法形参实现多态
使用父类作为方法返回值实现多态
Object对象的六种方法的作用
哪些不能继承?
那些不能直接调用?
Java虚拟机的垃圾回收机制和垃圾对象