首页 > 编程语言 >秦疆的Java课程笔记:72 面向对象 instanceof和类型转换

秦疆的Java课程笔记:72 面向对象 instanceof和类型转换

时间:2023-12-15 17:23:02浏览次数:26  
标签:instanceof 类型转换 Java 子类 System Person Student println

  • instanceof关键字,用于判断左边的实例对象是否是右边的类的实例。
  • 先创建4个类,父类Person,其子类StudentTeacher,测试类Application。在Application中测试instanceof语句:
//父类
public class Person {}
//子类
public class Teacher extends Person {}
//子类
public class Student extends Person {}
//测试类
import OOP.demo.Person;  
import OOP.demo.Teacher;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {  
        Object a = new Student();  
        System.out.println(a instanceof Student);  
        System.out.println(a instanceof Person);  
        System.out.println(a instanceof Object);  
        System.out.println(a instanceof Teacher);  
        System.out.println(a instanceof String);  
    }  
}
====运行结果====
true
true
true
false
false
  • 上述代码存在三条继承关系:

    • Object>Person>Teacher
    • Object>Person>Student
    • Object>String
  • 首先,a本身属于Object类,但是Student类的实例对象,所以属于父类PersonObject,但不属于TeacherString

  • 其次,a作为一个Object类,是可以强制转换为其他子类,所以编译不会报错。

  • Object a = new Student();改为Person b = new Student(); a替换为b,其余不变。

import OOP.demo.Person;  
import OOP.demo.Teacher;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {  
        Person b = new Student();  
        System.out.println(b instanceof Student);  
        System.out.println(b instanceof Person);  
        System.out.println(b instanceof Object);  
        System.out.println(b instanceof Teacher);  
        //System.out.println(b instanceof String);   报错:不可转换的类型
    }  
}
====运行结果====
true
true
true
false
  • 不可转换的原因是,b属于Person类,和String类虽然同属Object的子类,但是相互之间没有继承关系,无法转换,故而报错

  • 再将Person b = new Student();改为Student c = new Student(); b替换为c,其余不变。

import OOP.demo.Person;  
import OOP.demo.Teacher;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {  
        Student c = new Student();  
        System.out.println(c instanceof Student);  
        System.out.println(c instanceof Person);  
        System.out.println(c instanceof Object);  
        //System.out.println(student instanceof Teacher);   报错:不可转换的类型
        //System.out.println(student instanceof String);   报错:不可转换的类型  
    }  
}
====运行结果====
true
true
true
  • 报错的原因同上。

  • 我自己的小结:

    • instanceof是看左边的实例对象是否从属于右边的类,看的是X a = new Y;右边类型的继承关系。有关则为true,无关则为false。
    • 而报错与否看的是X a = new Y;左边的类型的继承关系,没有继承关系则无法相互转换,故而报错。
  • 类型转换

//父类
public class Person {
	public void run() {  
	    System.out.println("run");  
	}
}
//子类
public class Student extends Person {
	public void go() {  
		System.out.println("go");  
	}
}
//测试类
import OOP.demo.Person;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {  
        Person a = new Student();  
        //a.go();   报错,父类无法调用子类的方法
        //通过强制转换,将父类转换为子类
        Student b = (Student) a;
        b.go();
    }  
}
  • 高转低(父转子),要通过强制转换。

  • 当然,也可以使用((Student) a).go将上述两句合成一句,没有必要再创建一个变量。

  • 沿用上面的代码,在测试类中试验子类转父类。

import OOP.demo.Person;  
import OOP.demo.Student;  
public class Application {  
    public static void main(String[] args) {  
        Student a = new Student();  
        a.go();   //子类调用自己的方法,没有问题
        Person b = a;  //子类转父类自动转换,不需要强制转换
        //b.go();   报错,转换为父类后无法调用子类的方法。
    }  
}
  • 子类转换为父类,可能会丢失子类的方法。

  • 总结:

    • 父类引用指向子类的对象
    • 子类转换为父类(向上转型),不用强制转换
    • 父类转换为子类(向下转型),需要强制转换
    • 方便方法的调用,减少重复的代码

标签:instanceof,类型转换,Java,子类,System,Person,Student,println
From: https://www.cnblogs.com/Acolyte/p/17903820.html

相关文章

  • 秦疆的Java课程笔记:71 面向对象 什么是多态
    多态即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。(指向父类或者有关系的类。)//父类=======================================publicclassPerson{}//子类=================================......
  • 《Java编程思想第四版》学习笔记47--关于handleEvent
    (4)增加可以被handleEvent()方法测试事件的组件到练习3中。过载handleEvent()并在文字字段中为每个组件显示特定的消息。                                                ......
  • 无涯教程-Java - toUpperCase()函数
    该方法返回指定的char值的大写形式。toUpperCase()-语法chartoUpperCase(charch)这是参数的详细信息-ch  - 原始字符类型。toUpperCase()-返回值此方法返回指定的char值的大写形式。toUpperCase()-示例publicclassTest{publicstaticvoidmain(Str......
  • javaweb实现文件上传与下载功能
    本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下一、文件上传要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。上传大多数情况是通过表单的形式提交给服务器,使用<inputt......
  • JavaScript 浏览本地文件夹
    1.JavaScript浏览本地文件夹button.onclick=asyncfunction(){//给按钮绑定事件try{consthandler=awaitshowDirectoryPicker(//{//mode:'readwrite',//指定读写模式:读/读写//startIn:'documents'//......
  • Java定义类的参数时的一个注意事项
    我在做CS61B21sp的lab7时,为了实现BSTpublicclassBSTMap<KextendsComparable<K>,V>implementsMap61B<K,V>{}定义了一个类privateclassNode<K,V>{privateKkey;privateVvalue;privateNode<K,V>left,......
  • JavaScript-IndexedDB API
    概述随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。现有的浏览器数据储存方案,都不适合储存大量数据:Cookie的大小不超过4KB,且每次请求都会发送回服务器;LocalStorage在2.5MB到10MB之间(各家浏览器不......
  • Java核心知识体系8:Java如何保证线程安全性
    Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解Java核心知识体系6:集合框架详解Java核心知识体系7:线程不安全分析1Java内存模型(JMM)如何解决并发问题维度1:使......
  • 无涯教程-Java - isWhitespace()函数
    该方法确定指定的char值是否为空格,包括空格,制表符或换行符。isWhitespace()-语法booleanisWhitespace(charch)这是参数的详细信息-ch  - 原始字符类型。isWhitespace()-返回值如果传递的字符确实是空格,则此方法返回true。isWhitespace()- 示例publiccla......
  • 无涯教程-Java - isDigit()函数
    该方法确定指定的char值是否为数字。isDigit()-语法booleanisDigit(charch)这是参数的详细信息-ch  - 原始字符类型。isDigit()-返回值如果传递的字符确实是数字,则此方法返回true。isDigit()-示例publicclassTest{publicstaticvoidmain(String......