Java初学笔记8-【多态、向上转型、向下转型、动态绑定机制、多态数组、多态参数、object类的四大方法(equals、hashcode、toString、finalize))】

1.多态

(1)能提高复用性
(2)重写与重载体现多态性

2.对象的多态

前提:两个对象(类)存在继承关系

(1)一个对象的编译类型与运行类型可以不一致

eg. A为B的父类 A a = new B ( ) ; 其中编译类型为A ,运行类型为B

(2)编译类型在定义对象时候就确定了,不会变
(3)运行类型是可以改变的
(4)= 左边为编译类型 = 右边为运行类型

3.向上转型

父类

class Fruit{
	public void show() {
		System.out.println("this is a fruit");
	}
}

子类

class Apple extends Fruit{
    @Override
    public void show() {
	System.out.println("this is a apple");
    }
    public void test() {
	System.out.println("i am a apple");
    }
}

调用方法

Fruit fruit = new Apple();  //this is a apple
fruit.show();   //报错

(1)父类的引用指向子类的对象
(2)在权限范围内,可以调用父类所有成员
(3)不能调用子类的特有成员
(4)运行时看运行类型,遵循就近原则
在这里插入图片描述

4.向下转型

Fruit fruit = new Apple();
Apple apple = (Apple) fruit;  //向下转型

子类

class Orange extends Fruit{
    @Override
    public void show() {
	System.out.println("this is a Orange");
    }
    public void test() {
	System.out.println("i am a Orange");
    }
}
Fruit fruit = new Apple();
Orange orange = (Orange) fruit;  //编译成功,运行报错

(1)将父类引用强制转成子类引用
(2)只能强转父类引用,不能强转父类对象
(3)只能强转父类引用的前提:父类一开始就指向某一个子类对象
(4)只能强转父类引用的结果:转型后可以调用子类的所有成员

4.5 转型的好处

可以减少编程代码。
假设在主类中定义了一个run()方法,该方法传入一个Fruit参数,并调用了Fruit对象的show()方法,代码如下:

public static void run(Fruit fruit) {
	fruit.show();
   }

在main()方法中的代码如下:

public static void main(String[] args) {
    run(new Fruit());
    run(new Apple());
    run(new Orange());
    }

上述代码中,调用run()方法时的参数不仅是Fruit对象,也可以是Apple对象和Orange对象,当传入的是Apple对象和Orange对象时,就会向上转型成Fruit对象,但是调用的show()方法还是Apple对象和Orange对象的show()方法。

5.属性无多态之说

(1)属性的值直接看编译类型
(2)a instanceof b 判断a的运行类型是否为b的运行类型,或者判断a的运行类型是否为b的运行类型的子类型

6.动态绑定机制

(1)当调用对象方法时,该方法会和该对象的内存地址(运行类型)绑定
(2)调用对象属性时,没有动态绑定机制,哪里声明属性,哪里就调用属性
在这里插入图片描述

7.多态数组

(1)数组的定义类型为父类类型,而里面保存的实际元素类型为子类类型。

eg. A为B,C类的父类,A[ ] a = new A[ ] ;
a [0] = new A(xxx) ;a[1] = new B(xxx) ;a[2] = new C(xxx) ;

(2)多态数组常与:类型判断instanceof,向下转型相结合

8.多态参数

方法定义时,允许形参为父类类型,实参为子类类型。
在这里插入图片描述
在这里插入图片描述

多态的练习题

在这里插入图片描述
在这里插入图片描述

9.object类详解之equals方法

(1)==
可判断基本数据类型(判断值),引用数据类型(判断地址值)。
(2)equals
若在object类中,只能判断引用类型,即地址值是否一样;
若在子类中重写。如String类,Integer类,用于判断内部值是否一样。

10.object类详解之hashcode方法

(1)提高哈希表性能
(2)若引用指向同一对象,则哈希值一样;反之不一样。
(3)哈希值根据地址值而来,但是不能将哈希值等同于地址值。
(4)在集合中可以重写

11.object类详解之toString方法

(1)在object类中:
返回:包名 + 表名 + @ + 十六进制的哈希值
(2)在子类中:
重写该方法,是为了打印对象属性信息。

有默认形式,快捷键 alt + insert -> toString()

(3)输出对象时,toString默认被调用

即:a为A类的对象 ,以下两种情况等价
System.out.println(a);
System.out.println(a.toString);

12.object类详解之finalize方法

(1)在object类中:
当某个对象不存在引用时,由对象的垃圾回收器调用该方法把对象在堆中的空间释放。
(2)在子类中:
重写后,可以做一些资源释放操作,例如:数据库连接,打开文件。

有默认形式,快捷键 alt + insert -> finalize()

(3)垃圾回收机制由系统调用,有自己的GC算法来决定触发的阶段;人为可以主动触发回收机制,用System.gc( ) ;

object类的练习题

equals方法的重写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

部分图片来自B站韩顺平老师

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
多态是指同一行为具有多个不同的表现形式。在Java中,多态可以通过向上转型向下转型来实现。向上转型是指将子型转换为父型,这个过程是默认的,可以通过父型的变量引用子型的对象。例如,Animal a = new Cat(); 这里Cat是Animal的子,通过向上转型,将Cat型的对象赋值给Animal型的变量a。这样,a可以调用Animal方法和属性,但无法调用Cat特有的方法和属性。这是因为变量a被限定为Animal型,只能访问Animal中定义的方法和属性。这就是多态向上转型。 而向下转型是指将父型转换为子型的转换过程,这个过程是强制的。在向上转型后,如果需要使用子特有的方法和属性,就需要进行向下转型向下转型的语法是将父型的变量强制转换为子型的变量。例如,Cat c = (Cat) a; 这里将Animal型的变量a强制转换为Cat型的变量c。这样,变量c就可以调用Cat特有的方法和属性,但需要注意的是,只有在向上转型之后,才能进行向下转型,否则会出现编译错误或运行时错误。这就是多态向下转型。所以,多态通过向上转型向下转型实现了同一行为具有多个不同的表现形式的特性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [多态向上转型向下转型](https://blog.csdn.net/Iam_am_lbj/article/details/122458965)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃凉拌辣芒果

不断学习,不断进步,共勉~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值