Java多态

什么是多态
同一个引用类型,使用不同的实例而执行不同操作.
父类引用,子类对象
多态的作用
使用父类作为方法形参实现多态
在这里插入图片描述
♨️ ♨️ ♨️
注意:使用父类作为形式参数,可以接受子类的对象作为实参.进入到方法之后,该对象仅能当做父类使用,无法访问子类的成员.
到底调用谁的方法
在这里插入图片描述
父类对象引用实际指向的对象是谁,就执行谁的方法.
⚠️⚠️⚠️
在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虚拟机的垃圾回收机制和垃圾对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值