Java的学习笔记(12)对象 七

简介: 对象13.1:instanceofinstanceof(类型转换)引用类型,判断一个对象是什么类型package oop.Demo07;public class Application { public static void main(String[] args) { // Object > String // Object > Person > Teacher // Object > Person > Student Object object = new Student(); // System

对象13.1:instanceof

instanceof(类型转换)引用类型,判断一个对象是什么类型

package oop.Demo07;
public class Application {
    public static void main(String[] args) {
      //  Object > String
      //  Object > Person > Teacher
      //   Object > Person > Student
       Object object = new Student();
       // System.out.println(X instanceof  Y);  能不能编通过,X与Y是否纯在父子关系
        System.out.println(object instanceof Student);     //ture
        System.out.println(object instanceof Person);       //ture
        System.out.println(object instanceof Object);       //ture
        System.out.println(object instanceof Teacher);      //false    此处的object是Student类型的,与Teacher不是父子关系
        System.out.println(object instanceof String);       //false
        Person person = new Student();
        System.out.println(person instanceof Student);     //ture
        System.out.println(person instanceof Person);       //ture
        System.out.println(person instanceof Object);       //ture
        System.out.println(person instanceof Teacher);      //false
    //    System.out.println(person instanceof String);       //编译报错,没有关系就报错
        Student student = new Student();
        System.out.println(student instanceof Student);     //ture
        System.out.println(student instanceof Person);       //ture
        System.out.println(student instanceof Object);       //ture
      //  System.out.println(student instanceof Teacher);      //编译报错
        //    System.out.println(student instanceof String);       //编译报错
    }
}
package oop.Demo07;
public class Person {
    public void run(){
        System.out.println("run");
    }
}
package oop.Demo07;
public class Student extends Person{
    public void go() {
        System.out.println("go");
    }
}
package oop.Demo07;
public class Teacher extends Person{
}

对象13.2 类型之间的转换

// 父类
public class Parent {}
// 子类
public class Son extends Parent {}
// 女儿类
public class Daughter extends Parent {}

子类转父类

Son son = new Son();
Parent parent = (Parent) son;

运行没问题

父类的引用指向子类转父类对象

Parent son = new Son();
Parent parent = (Parent) son;

运行没问题,这种肯定也是可以的

父类转子类

父类的引用指向父类转子类对象

Parent parent = new Parent();
Son son = (Son) parent;

运行有问题会报 ClassCastException

父类的引用指向子类转子类对象

Parent parent = new Son();
Son son = (Son) parent;

运行没有问题

父类的引用指向子类转另一个子类对象

Parent parent = new Son();
Daughter daughter = (Daughter) parent;

运行时报出 ClassCastException 的异常

package oop.Demo07;
public class Application {
    public static void main(String[] args) {
        //  Person父类  run()方法   ,   Student子类 go()方法
        // 父类的方法,子类可以用,但是子类特有的方法,父类不可以调用
        Person person = new Person();
        person.run();
        //  person.go();   子类特有的方法,父类不可以调用
        Student student1 = new Student();
        student1.go();
        student1.run();
        //向上转型,子转父
        //也可以理解为将一个子类的对象转化为父类的对象(隐形转型,自动的),小类转大类
        Person one = new Person();
        one.run();
        Person two = new Student();
        //  父类引用子类实例,可以调用子类重写父类的的方法以及父类派生的方法,无法调用子类独有的方法
        //  注意:父类中的静态方法无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法。(如果父类中存在静态方法)
        two.run();
        // two.go();     报错,父类引用子类实例,无法调用子类独有的方法
        //子类转化为父类,可能会丢失自己本来的一些方法。  子类转父类,子类拓展的方法会丢失。
        // 向下转型,必须强转
        //类型之间的的转化 :父转子,向下转换要强制转换,也就是父类转为子类要强转
         Person obj = new Student();
        // obj.go()   会报错, obj是父类Person对象实例,需要将obj转换为Student类型,才可以使用Student类型的方法
         Student student = (Student) obj;
         student.go();
        //二合一:  ((Student) obj).go();
     /*
     1. 父类引用指向子类的对象
     2. 把子类转换为父类,向上转型,直接转;
     3. 把父类转换为子类,向下转型,强制转换;
     4. 方便方法的调用,减少重复的代码,简洁
      */
    }
}
相关文章
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
54 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
47 0
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
35 6
|
2月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
31 3
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
XML Java Maven
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
69 7
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第3天】Java零基础教学篇,手把手实践教学!
32 1
|
2月前
|
Java 数据安全/隐私保护
java类和对象
java类和对象
26 5