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


相关文章
|
1月前
|
Java 程序员 开发者
Java 中的多态性
Java中的多态性是面向对象编程的重要特性之一,允许一个接口或基类引用指向其不同子类的对象,实现“一种接口,多种方法”。通过方法重写和动态绑定,多态性提高了代码的灵活性和可扩展性。
68 3
|
2月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
76 4
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
56 17
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
3月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
38 6
|
3月前
|
设计模式 算法 Java
Java中的多态性:深入理解与应用
【10月更文挑战第16天】 在Java编程的广阔天地中,多态性作为一种强大的面向对象特性,扮演着至关重要的角色。它允许我们以统一的方式处理不同类型的对象,极大地提高了程序的灵活性和可扩展性。本文将深入浅出地探讨Java中多态性的概念、实现机制以及在实际开发中的应用,帮助读者更好地理解和运用这一特性。
|
2月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
53 0
|
4月前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
39 10
|
4月前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
69 18