0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

全面讲解⾯向对象编程三⼤特性 2

jf_78858299 来源:小牛呼噜噜 作者:小牛呼噜噜 2023-02-09 14:25 次阅读

我们来看上面part1部分:

Cat cat_ = new Cat();
        cat_.eat();
        cat_.sleep();
        cat_.work();

结果:

吃鱼

猫会睡懒觉。

动物可以帮助人类干活!

cat_.work(); 这处继承了父类Animal的方法,还是很好理解的

我们接着看part2:

Animal cat=new Cat();
        cat.eat();
        cat.work();
        cat.sleep();//此处编译会报错。

        Animal dog=new Dog();
        dog.eat();//结果为:吃骨头。此处调用子类的同名方法。

这块就比较特殊了,我们一句句来看

Animal cat=new Cat(); 像这种这个 父类引用指向子类对象,这种现象叫做: "向上转型" ,也被称为 多态的引用

cat.sleep();这句 编译器会提示 编译报错。表明:当我们当子类的对象作为父类的引用使用时,只能访问子类中和父类中都有的方法,而无法去访问子类中特有的方法

值得注意的是:向上转型是安全的。但是缺点是:一旦向上转型,子类会丢失子类的扩展方法,其实就是 子类中原本特有的方法就不能再被调用了。所以cat.sleep()这句会编译报错。

cat.eat();这句的结果打印:吃鱼。程序这块调用我们Cat定义的方法。

cat.work();这句的结果打印:动物可以帮助人类干活!我们上面Cat类没有定义work方法,但是却使用了父类的方法,这是不是很神奇。其实此处调的是父类的同名方法

Animal dog=new Dog();dog.eat();这句的结果打印为:吃骨头。此处调用子类的同名方法。

由此我们可以知道当发生向上转型,去调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。如果子类没有同名方法,会再次去调父类中的该方法

向上转型

我们现在知道了 向上转型时会丢失子类的扩展方法,哎,但我们就是想找回来,这可咋办?

向下转型可以帮助我们,找回曾经失去的

我们来看part3:

Cat cat_real = (Cat)cat;  //注意 此处的cat 对应上面父类Animal,可不是子类
    cat_real.sleep();

Cat cat = (Cat)cat; cat222.sleep(); 这个向下转型非常像"强转"。

打印的结果:猫会睡懒觉。此处又能调用了 子类Cat 的 sleep()方法了。

一道简单的面试题

我们再来看一道有意思的题,来强化理解

public class Main {
    
    static class Animal{
        int weight = 10;

        public void print() {
            System.out.println("this Animal Print:" + weight);
        }

        public Animal() {
            print();
        }
    }

    static class Dog extends Animal {
        int weight = 20;

        @Override
        public void print() {
            System.out.println("this Dog Print:" + weight);
        }

        public Dog() {
            print();
        }
    }

    public static void main(String[] args) {
        Dog dog = new Dog();

        System.out.println("---------------");
        Animal dog222 = new Dog();
        Dog dog333 =  (Dog)dog222;
        
        System.out.println("---------------");
        Dog dog444 = (Dog)new Animal();

    }
}

执行结果:

this Dog Print:0
this Dog Print:20
---------------
this Dog Print:0
this Dog Print:20
---------------
this Animal Print:10
Exception in thread "main" java.lang.ClassCastException: com.zj.Main$Animal cannot be cast to com.zj.Main$Dog
 at com.zj.Main.main(Main.java:15)

做对了嘛,不对的话,复制代码去idea中debug看看

我们先看第一部分

Dog dog = new Dog();

程序内部的执行顺序:

  1. 先 初始化 父类Animal 的属性 int weight=10
  2. 然后 调用父类Animal的构造方法,执行print()
  3. 实际调用子类Dog的print()方法,打印:this Dog Print:0,由于此时的子类属性weight 并未初始化
  4. 初始化 子类Dog 的属性 int weight=20
  5. 调用 子类Dog的构造方法,执行print()
  6. 实际调用当前类的print()方法,打印this Dog Print:20

其中有几处我们需要注意一下:实例化子类dog,程序会去默认优先实例化父类,即子类实例化时会隐式传递Dog的this调用父类构造器进行初始化工作,这个和JVM的双亲委派机制有关,这里就不展开讲了,先挖个坑,以后再来填

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1579

    浏览量

    48713
  • 面向对象编程

    关注

    0

    文章

    22

    浏览量

    1770
收藏 人收藏

    评论

    相关推荐

    嵌入式C语言面向对象编程---多态

    前两篇文章主要讲述了 C 语言面向对象编程– 封装和继承。本篇文章继续来讨论一下,如何使用 C 语言实现面向对象编程的另一个重要特性:多态。
    发表于 10-31 14:41 785次阅读

    Python的面向对象编程详解

    一般编程可分为面向过程编程,和面向对象编程。Python的面向对象编程,与Java的面向
    发表于 09-04 16:35 291次阅读
    Python的面向<b class='flag-5'>对象</b><b class='flag-5'>编程</b>详解

    每日一教labview视频教程【12.15】labview面向对象编程(上)

    面向对象编程视频:专家从类开始进行讲解,详细说明了如何进行面向对象编程。http://yunpan.cn/lk/480ep1p
    发表于 12-15 10:35

    利用LabVIEW工程库实现面向对象编程

    。VI Scripting技术也是LabVIEW的新特性。利用它可以直接在LabVIEW中解析或更改LabVIEW VI。. LabVIEW面向对象编程的具体实现方法我们可以把一组相
    发表于 12-06 12:41

    编程魔法师大思想视频宣传片

    讲解了单片机裸编程项目的设计实现过程,并通过一只电机对象到两只电机对象的设计演变过程,深入讲解了数码分离、线程实现、
    发表于 04-23 21:46

    面向对象编程及其特性 精选资料分享

    编程语言分为面向过程编程、函数式编程和面向对象编程。其实python就是一种面向对象
    发表于 07-21 08:38

    谈谈面向对象编程

    在工业自动化领域,梯形图逻辑仍然是最常用的编程语言之一,但对于更加复杂的控制对象,面向对象编程不失为一种高效率的方式。下面先来谈谈面向对象
    发表于 09-08 07:47

    面向对象编程介绍

    目录一、面向对象编程介绍1.面向过程编程2.函数式编程3.面向对象
    发表于 12-13 07:22

    C++面向对象多线程编程 (pdf电子版)

    C++面向对象多线程编程共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了
    发表于 09-25 09:39 0次下载

    对象特性的测定

    对象特性的测定 一、 实验目的1、通过实验了解对象的静态和动态特性;2、掌握对象静态和动态特性
    发表于 05-17 10:53 14次下载

    面向对象编程练习

    实验 3 面向对象编程练习 一、实验目的     通过编程和上机实验理解 Java 语言是如何体现面向对象编程
    发表于 09-23 18:57 2945次阅读

    LabVIEW 网络讲坛第四季:面向对象编程的应用

    本视频主要讲解了基本概念,以及面向对象编程在LabVIEW中的应用。
    的头像 发表于 06-25 02:46 2741次阅读
    LabVIEW 网络讲坛第四季:面向<b class='flag-5'>对象</b>的<b class='flag-5'>编程</b>的应用

    Labview面向对象编程快速入门教程

    在面向对象编程中, 类用来表示通用特性。 例如,假设有一个描述汽车的类。 类中定义了各种汽车的通用特性对象是类的特定实例。汽车类的一个
    发表于 07-31 08:00 80次下载
    Labview面向<b class='flag-5'>对象</b><b class='flag-5'>编程</b>快速入门教程

    全面讲解⾯向对象编程三⼤特性 1

    把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 > 通俗地说,一个类
    的头像 发表于 02-09 14:24 222次阅读

    西门子PLC面向对象编程

    面向对象编程是计算机高级语言的一种高级编程模式,这种设计思想也可以应用于工业控制系统的plc程序中。虽然我们 无法实现面向对象编程的许多优
    发表于 04-17 11:41 4次下载
    西门子PLC面向<b class='flag-5'>对象</b><b class='flag-5'>编程</b>