首页 Java java教程 Java中的对象转型是什么?(附代码)

Java中的对象转型是什么?(附代码)

Oct 15, 2018 pm 01:50 PM

本篇文章给大家带来的内容是关于Java中的对象转型是什么?(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

向上转型:子类对象转为父类,父类可以是接口。公式:Father f = new Son();Father是父类或接口,son是子类。

向下转型:父类对象转为子类。公式:Son s = (Son)f;

我们将形参设为父类Animal类型,当执行test.f(c)时,内存情况如下图:

c作为Cat类型传入,Animal a作为形参,相当于执行了Animal a = new Cat(),这时a和c同时指向Cat对象,但此时a不能访问Cat类扩展的数据成员,所以再将a强转成Cat类型即可。如果不存在这样的转型机制,则针对猫和狗我们还要分别写两个函数f(Cat c)和f(Dog d)。但其实上图程序的可扩展性也不是最好的。我们还可以利用动态绑定(即多态)将扩展性进一步提升。多态机制的三个前提分别是:(1)要有继承,(2)要重写,即子类对父类中某些方法进行重新定义,(3)要向上转型,用父类引用指向子类对象。下面来看一个例子:

class Animal {    private String name;    /**
     * 在Animal类自定义的构造方法
     * @param name     */
    Animal(String name) {        this.name = name;
    }    /**
     * 在Animal类里面自定义一个方法enjoy     */
    public void enjoy() {
        System.out.println("动物的叫声……");
    }
}class Cat extends Animal {    private String eyesColor;    /**
     * 在子类Cat里面定义Cat类的构造方法
     * @param n
     * @param c     */
    Cat(String n, String c) {        /**
         * 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。
         * 把子类对象里面的父类对象先造出来。         */
        super(n);
        eyesColor = c;
    }    /**
     * 子类Cat对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。     */
    public void enjoy() {
        System.out.println("我养的猫高兴地叫了一声……");
    }
}/**
 * 子类Dog从父类Animal继承下来,Dog类拥有了Animal类所有的属性和方法。
 * @author gacl
 * */class Dog extends Animal {    /**
     * 在子类Dog里面定义自己的私有成员变量     */
    private String furColor;    /**
     * 在子类Dog里面定义Dog类的构造方法
     * @param n
     * @param c     */
    Dog(String n, String c) {        /**
         * 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。
         * 把子类对象里面的父类对象先造出来。         */
        super(n);
        furColor = c;
    }    /**
     * 子类Dog对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。     */
    public void enjoy() {
        System.out.println("我养的狗高兴地叫了一声……");
    }
}/**
 * 子类Bird从父类Animal继承下来,Bird类拥有Animal类所有的属性和方法
 * @author gacl
 * */class Bird extends Animal {    /**
     * 在子类Bird里面定义Bird类的构造方法     */
    Bird() {        /**
         * 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。
         * 把子类对象里面的父类对象先造出来。         */
        super("bird");
    }    /**
     * 子类Bird对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。     */
    public void enjoy() {
        System.out.println("我养的鸟高兴地叫了一声……");
    }
}/**
 * 定义一个类Lady(女士)
 * @author gacl
 * */class Lady {    /**
     * 定义Lady类的私有成员变量name和pet     */
    private String name;    private Animal pet;    /**
     * 在Lady类里面定义自己的构造方法Lady(),
     * 这个构造方法有两个参数,分别为String类型的name和Animal类型的pet,
     * 这里的第二个参数设置成Animal类型可以给我们的程序带来最大的灵活性,
     * 因为作为养宠物来说,可以养猫,养狗,养鸟,只要是你喜欢的都可以养,
     * 因此把它设置为父类对象的引用最为灵活。
     * 因为这个Animal类型的参数是父类对象的引用类型,因此当我们传参数的时候,
     * 可以把这个父类的子类对象传过去,即传Dog、Cat和Bird等都可以。
     * @param name
     * @param pet     */
    Lady(String name, Animal pet) {        this.name = name;        this.pet = pet;
    }    /**
     * 在Lady类里面自定义一个方法myPetEnjoy()
     * 方法体内是让Lady对象养的宠物自己调用自己的enjoy()方法发出自己的叫声。     */
    public void myPetEnjoy() {
        pet.enjoy();
    }
}public class Jerque {    public static void main(String args[]) {        /**
         * 在堆内存里面new了一只蓝猫对象出来,这个蓝猫对象里面包含有一个父类对象Animal。         */
        Cat c = new Cat("Catname", "blue");        /**
         * 在堆内存里面new了一只黑狗对象出来,这个黑狗对象里面包含有一个父类对象Animal。         */
        Dog d = new Dog("Dogname", "black");        /**
         * 在堆内存里面new了一只小鸟对象出来,这个小鸟对象里面包含有一个父类对象Animal。         */
        Bird b = new Bird();        /**
         * 在堆内存里面new出来3个小姑娘,名字分别是l1,l2,l3。
    * l1养了一只宠物是c(Cat),l2养了一只宠物是d(Dog),l3养了一只宠物是b(Bird)。
         * 注意:调用Lady类的构造方法时,传递过来的c,d,b是当成Animal来传递的,
         * 因此使用c,d,b这三个引用对象只能访问父类Animal里面的enjoy()方法。         */
        Lady l1 = new Lady("l1", c);
        Lady l2 = new Lady("l2", d);
        Lady l3 = new Lady("l3", b);        /**
         * 这三个小姑娘都调用myPetEnjoy()方法使自己养的宠物高兴地叫起来。         */
        l1.myPetEnjoy();
        l2.myPetEnjoy();
        l3.myPetEnjoy();
    }
}
登录后复制

上面的例子中,我们发现,如果我们想要加入新的动物,只需定义相应的类继承Animal,完全不用动任何一处代码,因为这里运用了面向对象最核心的东西——多态。与之前的例子不同,虽然我们一直强调当用父类的引用指向子类对象,父类无法访问子类自己的成员,但是方法与数据成员不同,具体调哪一个方法是等到运行时决定的,new出了什么对象就调用相应对象的方法,取决于实际new出的对象而不是指向对象的引用,所以当传入不同动物类型,mypetEnjoy()就会去执行不同的方法。

 以上就是对Java中的对象转型是什么?(附代码)的全部介绍,如果您想了解更多有关Java视频教程,请关注PHP中文网。

以上是Java中的对象转型是什么?(附代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? 如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何在Java中实施功能编程技术? 如何在Java中实施功能编程技术? Mar 11, 2025 pm 05:51 PM

本文使用lambda表达式,流API,方法参考和可选探索将功能编程集成到Java中。 它突出显示了通过简洁性和不变性改善代码可读性和可维护性等好处

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? 如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? 如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何将Java的Nio(新输入/输出)API用于非阻滞I/O? 如何将Java的Nio(新输入/输出)API用于非阻滞I/O? Mar 11, 2025 pm 05:51 PM

本文使用选择器和频道使用单个线程有效地处理多个连接的Java的NIO API,用于非阻滞I/O。 它详细介绍了过程,好处(可伸缩性,性能)和潜在的陷阱(复杂性,

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? 如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

如何使用Java的插座API进行网络通信? 如何使用Java的插座API进行网络通信? Mar 11, 2025 pm 05:53 PM

本文详细介绍了用于网络通信的Java的套接字API,涵盖了客户服务器设置,数据处理和关键考虑因素,例如资源管理,错误处理和安全性。 它还探索了性能优化技术,我

See all articles