java多态性,instanceof及Object类

18天Java学习---16.面向对象编程11-Java多态性,instanceof及Object类 多态是一个之前一直搞不清楚的概念,通过这次笔记,对多态的概念及应用有了较全面的认识,同时学习了instanceof关键字以及Object类的特点. 1. Java中类的多态 所谓类的多态性,是指子类对象和父类对象之间的相互转换. 这里分为两部分做笔记: 1.1 子类对象向父类对象转换(向上转换) 子类对象向父类对象的转换是自动转换.格式为: 父类对象... 阅读详情

多态是一个之前一直搞不清楚的概念,通过这次笔记,对多态的概念及应用有了较全面的认识,同时学习了instanceof关键字以及Object类的特点.

1. Java中类的多态

      所谓类的多态性,是指子类对象和父类对象之间的相互转换. 这里分为两部分做笔记: 

   1.1 子类对象向父类对象转换(向上转换)

      子类对象向父类对象的转换是自动转换.格式为: 父类对象 = 子类对象.

      这里需要注意的一点事: 子类对象转换为父类对象后,所调用的方法一定会是子类复写后的方法而非父类原有方法.

      例如下面的例子:      

  

class Person
{
	public void fun1()
	{
		System.out.println("Person -------> public void fun1() ");
	}
	public void fun2()
	{
		//fun2()调用的是fun1()的方法
		this.fun1();
	}
}
class Student extends Person
{
	//复写Person类中的fun1()方法
	public void fun1()
	{
		System.out.println("Student -------> public void fun1()");
	}
	public void fun3()
	{
		System.out.println("Student -------> public void fun1()");
	}
}
public class Demo01
{
	public static void main(String args[])
	{
		//声明一个父类对象
		//new Student()是实例化一个子类对象,向父类对象转换
		//子类对象向父类对象转换之后,所调用的方法一定是子类复写后的方法
		Person p = new Student();
		p.fun1();
		p.fun2(); //这里也是通过this.fun2()调用的子类复写后的方法fun1()
	}
}

1.2 父类对象向子类对象转换(向下转换)

      父类对象向子类对象的转换是强制转换. 格式为: 子类对象 = (子类名称) 父类对象

      在父类对象向子类对象的转换的过程中,需要注意的是: 如果父类对象是实例化的父类对象而不是用子类对象转换过来的对象,则不能在强制转换为子类对象,否则会出现ClassCastException类转换异常. 也就是说,能进行父类对象向子类对象转换的前提是: 之前是使用子类对象的实例来初始化得父类对象. 例如下面例子中,是先使用实例化的子类对象转换为父类对象的.      

class Person  
{  
    public void fun1()  
    {  
        System.out.println("Person -------> public void fun1() ");  
    }  
    public void fun2()  
    {  
        //fun2()调用的是fun1()的方法   
        this.fun1();  
    }  
}  
class Student extends Person  
{  
    //复写Person类中的fun1()方法   
    public void fun1()  
    {  
        System.out.println("Student -------> public void fun1()");  
    }  
    public void fun3()  
    {  
        System.out.println("Student -------> public void fun1()");  
    }  
}  
public class Demo02  
{  
    public static void main(String args[])  
    {  
        //声明一个父类对象, new Student()是实例化一个子类对象,该子类实例化对象向父类对象转换   
        //父类对象向子类对象的转换,必须经过强制转换.   
        /* 注意: 若父类对象是实例化为父类对象而不是下例中用子类对象实例化后转换为父类对象, 
        那这时候就不能再强制转换为子类对象了,否则会有ClassCastException类转换异常 */  
        Person p = new Student();//new Student()实例化一个子类,初始化父类p(本人理解,非原作者) 
        Student s = (Student) p;  
        s.fun3();  
        s.fun1();  
    }  
}  

结论:

      在进行向下转换之前,两个对象必须先发生向上转换关系(如上面例子),否则无法转换(出现类转换异常).


2. instanceof关键字

      instanceof用于判断某个对象是否是某个类的实例. 例如: a instanceof B 若a是B的实例,则返回true,否则返回的是false. 

   instanceof的使用时机:

      例如下例,一般情况下, 都是在转型之前使用instanceof进行一下判断,这样可以进行比较安全的类型转换.     

class A  
{  
    public void fun1()  
    {  
        System.out.println("A --> public void fun1()") ;  
    }  
    public void fun2()  
    {  
        // fun2方法调用的是fun1方法   
        this.fun1() ;  
    }  
}  
class B extends A  
{  
    // 覆写A类中的fun1()方法   
    public void fun1()  
    {  
        System.out.println("B --> public void fun1()") ;  
    }  
    public void fun3()  
    {  
        System.out.println("B --> public void fun3()");  
    }  
}  
class C extends A  
{  
    // 覆写A类中的fun1()方法   
    public void fun1()  
    {  
        System.out.println("C --> public void fun1()") ;  
    }  
    public void fun5(){  
        System.out.println("C --> public void fun5()");  
    }  
}  
public class Demo03{  
    public static void main(String args[])  
    {  
        fun(new C()) ;  
    }  
    /* 如果传入的是B类的对象,则要求再调用fun3()方法; 
    如果传入的是C类的对象,则要求再调用fun5()方法。 
    这样,通过instanceof,实现了判别某个对象到底是谁的实例 */  
    //这里等价于A a=new B();A a=new C(),如果A a改为B a或C a下面的if语句会报错,因为兄弟类不能相互转换。                                    
   // 这就是常用的:父类在方法中作形参,子类在方法中作实参(本人理解,非原作者) 
    public static void fun(A a)
    {  
        a.fun2() ;  
        //如果a是B的实例化对象,则调用fun3()   
        if(a instanceof B)  
        {  
            B b = (B)a;  
            b.fun3() ;  
        }  
        //如果a是B的实例化对象,则调用fun5()   
        if(a instanceof C)  
        {  
            C c = (C)a ;  
            c.fun5() ;  
        }  
    }  
}  

 

3. Object类

      所有的类都继承自Object类,这是所有类的一个基类.

      一个比较好的类,需要复写Object类中的三个方法.

   |- public String toString()     

   |- public boolean equals(Object obj)

   |- public int hashCode()

      在下面的例子中,类Student复写了上面的toString()方法和equals()方法,而且使用到了instanceof关键字,算是一个小复习题目了~      

class Student  //任意类都是继承了Object类,最好复写里面的toString()和equals()方法   
{  
    private String name;  
    private int age;  
    public Student(String name,int age)  
    {  
        this.name = name;  
        this.age = age;  
    }  
      
    //复写Object类中的toString()方法,实现自定义toString()   
    public String toString()  
    {  
        return "该学生的姓名是: "+name+",该学生的年龄是: "+age;  
    }  
    //复写Object类中的equals()方法,注意,Object类中equals()接收的是Object对象   
    public boolean equals (Object obj)  
    {  
        //如果被比较对象和比较对象的内存地址都是一样的,那肯定是同一对象   
        //注意: 内存地址的比较使用"=="   
        if (this == obj)  
        {  
            return true;  
        }  
        else  
        {  
            //如果obj不是Student的实例,肯定不相等了,返回false;   
            if(!(obj instanceof Student))  
            {  
                return false;  
            }  
            else  
            {     
                //走到这步,说明obj是Student的实例对象,进行类型转换后对比之   
                Student stu = (Student) obj;  
                if(this.name.equals(stu.name)&&this.age == stu.age)//这里调用equals?
                {  
                    return true;  
                }  
                else  
                {  
                    return false;  
                }             
            }  
        }  
    }  
}  
public class Demo04  
{  
    public static void main(String args[])  
    {  
        Student stu1 = new Student("newsainton",23);  
        Student stu2 = new Student("newsainton",23);  
          
        //使用toString()方法输出stu1对象   
        System.out.println(stu1.toString());  
        //使用toString()方法输出stu2对象   
        System.out.println(stu2.toString());  
        //比较stu1和stu2是否相等   
        System.out.println("比较stu1和stu2是否相等: "+ stu1.equals(stu2));  
    }  
}  



 

常遇困境,说明你在进步!
       常有压力,说明你有目标!

作者:notifier
出处:http://www.cnblogs.com/notifier/




C++ 程序稳定运行一段时间后异常中止?vc6 运行库的bug!!! 事件查看器提示:错误应用程序 xxxxxxx.exe,版本 0.0.0.0,错误模块 MSVCRTD.DLL,版本 6.0.9782.0,错误地址 0x00012b40。这是一个通信方面的软件,需要长期运行,在压力测试时,高负荷连续运行一定天数时必定崩溃,而且都是在msvcrtd.dll中崩溃。后来在dump文件中发现调用栈在是MSVCRTD.DLL模块,跟踪代码发现是在void * __cdecl _heap_alloc_dbg(        size_t nSize,        int nBloc 阅读详情

相关推荐

temu登录接口逆向分析(含Py纯算)

【代码】temu登录接口逆向分析(含Py纯算)

数据精灵喵 1948

Java面向对象---instanceof和Object

Java面向对象---instanceof和Object

m0_69610954的博客 1422

灰度发布、蓝绿部署、双活架构与数据同步/备份/迁移

本文系统介绍了现代互联网系统的核心部署策略与数据管理技术体系。主要内容包括:1)三种服务发布策略(灰度发布、蓝绿发布、滚动发布)的原理、实现方式和适用场景对比;2)高可用架构设计(同城双活、异地双活、异地多活)的技术方案;3)数据同步机制、备份策略与迁移方案的设计要点。文章通过架构图、流程图和配置示例详细展示了各类技术的实施方法,并分析了不同方案的优劣及风险控制措施,为构建高可用、高可靠的分布式系统提供了完整的技术指南。

zane的博客 515

Java中"abc" instanceof Object返回结果

返回结果:true instanceof 是Java的一个二元操作符,和=,>,<是同一类的比较运算符。因为它由字母组成的,所以也是Java的关键保留字。 它的作用是测试它左边的对象是否是它右边类的实例,返回boolean类型数据。 "abc"是String对象的引用,指向一个String对象,然后用instanceof来测试它所指向的对象是否是Object类的实例。显然这是真的...

qq_39525799的博客 8078

AI学习记录 - transformer的位置编码的理解

先看三角函数为什么可以,我们看下三角函数的图像先提一个点:位置信息肯定是唯一的,或者是在很长的文字当中,起码重复度不会太高,x轴代表位置,y轴代表叠加上去的值1、假设只使用一个三角函数sin,我们将第2和第14两个位置输入到sin,他们的值很像,在神经网络的训练中,很容易把第2个位置和第14个位置当成是一个位置,不满足我们上面说到的要求位置唯一性。sin2sin14。

weixin_43954090的博客 1412

学习海康VisionMaster之顶点检测

2:应用场景:海康VisionMaster的顶点检测功能在工业视觉检测中具有广泛的应用场景,尤其在精密制造、电子元件检测和机械加工等领域,其通过高精度定位物体的关键点(如角点、交点或边缘顶点)来实现自动化测量与质量控制。基本参数这里就是画ROI,设定跟踪参数和之前的工具是一样的方法,这里画的方向需要注意,如下图所示,边缘的扫描方向正好对应需要查找的边缘点。一个不是很规则的物体需要检测一个凸台的顶角坐标,其实靠边缘与边缘交点是不太稳定的,如下图所示,边缘很短,很容易产生误抓边缘。1:什么是顶点检测?

yuhouxiyang的专栏 1526

【抽象类object和instanceof的使用】

object对象和instanceof的使用 import java.util.Objects; public class ObjectTest { private String name; private int age; public ObjectTest(){ // super(); } public ObjectTest(String name,int age){ this.name = name; this.a...

qq_64106025的博客 1124

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 462

J2SE的学习——Object和instanceof关键字

1、Object类 学习类知识呢,当然还是应该看JDK文档,先看一下 也就是说所有的类都是Object类的子类 看一下主要的方法摘要: 这次的学习主要是对这两个方法进行系统性的学习 生成构造方法,父类只有Object 按住Ctrl,用鼠标点击Super,进去到Object类中,查看Object类的所有方法,这里查看所有方法也可以快捷键Ctrl+o进行查看。下图的有变就是Object类的所有方...

qq_43918130的博客 1289

从零开始:YOLOv8车牌检测模型训练全流程实战

本文详细介绍了从零开始训练YOLOv8车牌检测模型的全流程实战指南。内容涵盖环境搭建、数据集收集与标注、模型配置与训练、评估测试及高级优化技巧。通过使用预训练模型和迁移学习,开发者可以高效构建精准的车牌检测系统,并掌握模型导出与部署的关键步骤。

weixin_29061041的博客 335

STM32F407+LWIP实战:手把手教你移植mbedtls库实现Modbus TCP双向认证

本文详细介绍了如何在STM32F407微控制器上移植mbedtls库,结合LWIP协议栈实现Modbus TCP的双向认证功能。通过TLS 1.2加密通道,有效提升工业物联网通信的数据安全性,涵盖证书管理、内存优化及性能调优等关键步骤,为嵌入式系统开发者提供了一套完整的解决方案。

weixin_28721917的博客 516

【Java】类的继承、Object类、对象类型转换、instanceof操作符

1、类的继承 继承基本思想:基于某个父类的拓展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者重写父类中的某些方法。 使用关键字extends来标识两个类的继承关系。 例1:在项目中创建Test1和Test2类,进行相关说明演示。 public class Test1 { public Test1(){ //构造方法 } public void doSomething(){ //成员变量

Fanjufei的博客 634

材料仿真软件:LAMMPS_(8).温度和压力控制

在 LAMMPS 中,温度和压力的控制是通过多种恒温器和恒压器实现的。Nose-Hoover 恒温器和恒压器因其准确性和广泛适用性而被经常使用,而 Berendsen 恒温器和恒压器则因其计算效率高而适用于初步仿真或粗粒化模型。温度重标和压力重标方法虽然简单,但在某些情况下可以快速调整系统的温度和压力。通过选择合适的控制方法,可以根据具体的需求和系统特性来设计和运行分子动力学仿真,从而获得准确和可靠的结果。在实际应用中,建议先进行初步的仿真以确定合适的控制参数,然后再进行细致的仿真以验证结果的稳定性。

kkchenjj的博客 1695

Java学习笔记---16.面向对象编程11-Java多态性,instanceof及Object类

多态是一个之前一直搞不清楚的概念,通过这次笔记,对多态的概念及应用有了较全面的认识,同时学习了instanceof关键字以及Object类的特点. 1. Java中类的多态 所谓类的多态性,是指子类对象和父类对象之间的相互转换. 这里分为两部分做笔记: 2.1 子类对象向父类对象转换(向上转换) [img]http://album.hi.youkuaiyun.com...

yuan123456789hui的博客 165

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

3.Object类 / 类的继承的关键字extends / super关键字 / 多态性 / 向下转型 / instanceof操作符

文章目录Object类Java中类的继承的关键字extendsJava中super关键字的使用多态性向下转型及instanceof操作符 Object类 Object类是所有Java类的根父类 如果在类的声明中未使用extends关键字指明其父类, 则默认父类 为java.lang.Object类 Object类没有属性,只声明了一个空参构造器(看java的api接口说明文档) Object类中有一个方法叫做finalize(),其作用就是当对象不再使用时进行内存释放,一般的不要主动去调用这个方法,将其交给

木易进 845

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

方法重写,super,多态性,instanceof操作符,==和equals,Object类

目录方法重写重载和重写super调用属性和方法调用构造器多态性对象的多态性多态的使用多态的使用场景对象的多态性 方法重写 子类不能重写父类中private的方法 子类重写的权限修饰符不能小于父类被重写方法的权限修饰符 父类被重写方法的返回值是void,子类重写方法的返回值也只能是void 父类被重写方法的返回值是A类型,子类重写方法的返回值可以是A类或A类的子类。 父类被重写方法的返回值类型是基本数据类型,则子类重写方法的返回值类型必须是相同的基本数据类型。 子类重写的方法抛出的异常类型不大于父类被重写方

z754916067的博客 264

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java:面向对象(多态,instanceof,Object,对象克隆,包装类)

5000字吐血整理,Java(对象多态性,对象上下转型,instanceof,Object类,包装类,进制转换)。包括:基础知识,底层原理,代码复现,面试难点,刁钻问题解答。

燕双嘤 1021

java instanceof 类型判断_Java实例instanceof类型判断

instanceof是Java的一个二元操作符,和==,>,String s = "I AM an Object!";boolean isObject = s instanceof Object;我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值...

weixin_42558093的博客 726

Java面向对象(五)

主要介绍Java面向对象的第三个特征:多态性;instanceof关键字的使用;Object类的一些使用

m0_53452634的博客 197

Java基础之多态、向下类型转换、Object类

1.多态(向上类型转换) 对象的多态性:父类的引用指向子类的对象 有了对象的多态性后,编译期间只能指向父类的方法,运行期间,实质运行的是子类重写父类的方法。 前提:①继承关系②重写方法 注意点:①方法才具有多态性②属性不具有多态性 答案:20 //就近调用 20 //就近调用 true //将s的地址赋值给b,两地址肯定相同 10 //属性不具备多态性,调用的是Base中的count ...

weixin_56674682的博客 419

面向对象的特征之三:多态性

编译,看左边;运行,看右边。

Kenyangi 1303

JAVA基础9-多态性

多态性,虚拟方法调用,instanceof操作符,Object类的使用,toString方法

weixin_64925940的博客 252

Java学习路线:day13 面向对象(中)2

文章目录第四章 面向对象(中) 第四章 面向对象(中) 原文:https://shimo.im/docs/DhhTyxtgwdpjVd39/ 《第四章 面向对象(中)》 整个Java全栈系列都是笔者自己敲的笔记。写作不易,如果可以,点个赞呗!✌ ...

杨丙寅 1613

终极类——Object

Object类,注意事项

四川兔兔的博客 201

Java(8)面向对象——多态性、Object类、包装类、抽象类、接口

目录多态性Object类包装类抽象类接口 多态性 Object类 包装类 抽象类 接口

weixin_45847853的博客 190

13.Java学习笔记第十三节——面向对象<中>(三)(尚硅谷视频整理)

一、多态性的补充 1.instanceof 操作符 二、Object类的使用 三、==操作符与equals方法 1.== 操作符 2.equals方法 3.自定义类重写equals方法 四、toString() 方法 五、包装类的使用 1.单元测试方法 2.包装类 1. 基本类型→包装类 2. 包装类→基本类型 3. 包装类、基本类型→ String 类型 4. String 类型→ 包装类、基本类型 3.一个面试题

Hhuaahua的博客 317
上一篇: java中类对象之间的类型转换
下一篇: 开闭原则
ttwwok
博客等级 码龄17年 28粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值