java面对对象(中.2)(多态性,终极父类,instanceof,包装类等)

简介: 今天来讲java中的多态性,多态性我个人认为它是最重要,同时也是最难理解的!!!不过不用担心,下面就带你了解java中的多态性!

今天来讲java中的多态性,多态性我个人认为它是最重要,同时也是最难理解的!!!不过不用担心,下面就带你了解java中的多态性!


多态性,是面向对象中最重要的概念,在Java中的体现:

对象的多态性:父类的引用指向子类的对象

可以直接应用在抽象类和接口上


Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明

该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简

称:编译时,看左边;运行时,看右边。


若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)

多态情况下,

“看左边”:看的是父类的引用(父类中不具备子类特有的方法)

“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)


对象的多态 —在Java中,子类的对象可以替代父类的对象使用

一个变量只能有一种确定的数据类型

一个引用类型变量可能指向 ( 引用 ) 多种不同类型的对象

Person p = new Student();
Object o = new Person(); //Object 类型的变量 o ,指向 Person 类型的对象
o = new Student(); //Object 类型的变量 o ,指向 Student 类型的对象

子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向

上转型 (upcasting)

一个引用类型变量如果声明为父类的类型,但实际引用的是子类

对象,那么该变量就不能再访问子类中添加的属性和方法

Student m = new Student();
m.school = “pku”;
//合法,Student类有school成员变量
Person e = new Student();
e.school = “pku”;
//非法,Person类没有school成员变量

属性是在编译时确定的,编译时e为Person类型,没有school成员变量,因而编

译错误。

方法声明的形参类型为 父类 类型,可以使用 子类的对象 作为实参调用该方法

21d21520cb4b4ab299b03ac5433331cf.png

类似于:老板叫你找个人过来帮忙,你找来一个男人或者女人来都没关系,在这里人相当于父类,男人相当于子类,女人相当于子类,同理,老板叫你找个男人来的时候,你就不能随便找个是人的玩意就行了!!!!

虚拟方法调用(Virtual Method Invocation)

正常的方法调用

Person e = new Person();
e.getInfo();
Student e = new Student();
e.getInfo();


虚拟方法调用(多态情况下)



子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。

Person e = new Student();
e.getInfo();
//调用Student类的getInfo()方法


编译时类型和运行时类型


编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类

的getInfo()方法。——动态绑定

类似于:老板要看一个人跳舞,你找张三来,他跳的是芭蕾,你找李四来他跳的是爵士舞,但是老板让你找的时候,他不知道会看到是什么舞(编译行为),等来了开跳了才知道啊(运行时行为)

db56c35a0f4340fbbad27b9d65d4abb8.png88f5fa623e18413591760f53db62f31f.png


多态小结



多态作用:

提高了代码的通用性,常称作接口重用


前提:

需要存在继承或者实现关系

有方法的重写


成员方法:

编译时 :要查看 引用变量所声明的类 中是否有所调用的方法。

运行时 :调用实际 new 的对象所属的类 中的重写方法。


成员变量:

不具备多态性,只看引用变量所声明的类

关于多态还不止这些,还没有完,接下来我们就再深入理解一波!

0af3206e9d154798901e8a24e082e765.png39ebb0cc387044a4b0df2fa69fc9d565.png

下面是代码分析

public class ConversionTest {
public static void main(String[] args) {
double d = 13.4;
long l = (long) d;
System.out.println(l);
int in = 5;
Object obj = "Hello";
String objStr = (String) obj;
System.out.println(objStr);
Object objPri = new Integer(5);
// 所以下面代码运行时引发ClassCastException异常
String str = (String) objPri; } 
}

运行结果


13

Hello

Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')

   at ConversionTest.main(ConversionTest.java:33)


public class Test {
public void method(Person e) { // 设Person类中没有getschool() 方法
// System.out.pritnln(e.getschool()); //非法,编译时错误
if (e instanceof Student) {
Student me = (Student) e; // 将e强制转换为Student类型
System.out.pritnln(me.getschool());
} }
public static void main(String[] args){
Test t = new Test();
Student m = new Student();
t.method(m);  //子类自动向父类转型
} }

0839629377bd4db988d9ba4b8dc46fa7.png



子类继承父类



若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的 同名方法,系统将不可能把父类里的方法转移到子类中。

对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的 实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量


接下来我们说下,目前学习中我听过最中二的名字终极父类(Objext)

——Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点

包含了所有Java类的公共属性,其构造方法是Object( )


36bf3a4c2feb468f8799e2eff8cf64aa.pnge814d8084e154715b5dc7a9479896a06.png


到这里我们随便讲下== 和equals以及还有终极父类中方法


a9d8bc29dbcc40bc83e25ff7f2a3f6a6.png8f71075306a348a9a3b7994f4a704762.pngef6ccc00851c44108e2f4f132b21e392.pngff33f55a63ea445f93e83d52bf069cf9.pngd1a88110085443369e873fffb2b4118b.png

看到这里,你以为完了??趁热打铁我们下面来了解下包装类

我们都知道java有基本数据类型和引用数据类型,而它的口号又是“万事万物皆对象”,所以针对基本数据类型,他提出了包装类的概念,实现从基本数据类型到类的转化!!

9dc45173a0c64c59955f7ad37a6722fa.pngc5527167dca34674b7d9942ce11eec18.png6acb5aa500304aaaba602d8e490ff9ab.pngca68170ff8234268ac13943240ceaedd.png29a3ff94e31040d19406e712b351513f.png97c6c786126047c5b9fcc98cbcd67255.png

下面看下一道踩坑题:(你会中枪的,我说的)

Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);
System.out.println(1==i);
System.out.println(1==j);
System.out.println(i.equals(1));
System.out.println(j.equals(1));
      Integer m = 1;
      Integer n = 1;
      System.out.println(m == n);
Integer x = 128;
Integer y = 128;
System.out.println(x == y);

运行结果:


false

true

true

true

true

true

false


解释:


基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱,然后与基本数据类型进行值的比较


引用数据类型与基本数据类型进行比较,基本数据类型会进行自动装箱,与引用数据类型进行比较,Object中的equals方法比较的是地址,但是Integer类已经重写了equals方法,只要两个对象的值相同,则可视为同一对象,具体看API文档,所以这归根到底也是值的比较!


如果引用数据类型是直接new的话,不管值是否相同,这时两个对象都是不相同的,因为都会各自在堆内存中开辟一块空间


如果引用数据类型是这样 Integer i = 12;直接从常量池取对象,这是如果数值是在-128与127之间,则视为同一对象,否则视为不同对象


从常量池取对象跟new出来的对象也是不同的


   举例:

 

Integer i = 12; 
    Integer j = new Integer(12) 
    i == j

这时返回的是false


相关文章
|
27天前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
235 0
|
2月前
|
安全 Java
使用Java多态性进行数据类型转换
以上示范了如何通过多态性来执行安全有效地对于Java对象间相互之间进行正确方式与场合下正确格式与条件限定内对于各个层级关系内部成员及其功能调取与应有操作处理过程,并通过 `instanceof`关键字确保了程序运行期间遵循逻辑合理并符合预设规则条件限定内正常工作流程而无需担忧潜藏风险问题出现可能带来影响结果质量问题情况存在可能。
106 12
|
3月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
3月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
48 0
|
4月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
|
5月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
220 1
|
5月前
|
前端开发 Java 数据库连接
java bo 对象详解_全面解析 java 中 PO,VO,DAO,BO,POJO 及 DTO 等几种对象类型
Java开发中常见的六大对象模型(PO、VO、DAO、BO、POJO、DTO)各有侧重,共同构建企业级应用架构。PO对应数据库表结构,VO专为前端展示设计,DAO封装数据访问逻辑,BO处理业务逻辑,POJO是简单的Java对象,DTO用于层间数据传输。它们在三层架构中协作:表现层使用VO,业务层通过BO调用DAO处理PO,DTO作为数据传输媒介。通过在线商城的用户管理模块示例,展示了各对象的具体应用。最佳实践包括保持分层清晰、使用工具类转换对象,并避免过度设计带来的类膨胀。理解这些对象模型的区别与联系。
382 1
Java 中 instanceof 关键字用法
Java 中 instanceof 关键字用法
207 0
Java 中 instanceof 关键字用法
|
Java 编译器
Java小白踩坑录 - instanceof 用法揭秘
Java小白踩坑录 - instanceof 用法揭秘
539 0
Java小白踩坑录 - instanceof 用法揭秘
|
Java
Java中instanceof的用法
Java中instanceof的用法
146 0