java继承和多态

java继承和多态继承和多态文章目录继承和多态继承多态继承多态

继承和多态

继承

继承的概念

继承的基本语法

class 子类 extends 父类{ } 

注意:

  1. 使用 extends 指定父类.
  2. Java 中一个子类只能继承一个父类 (而C++/Python等语言支持多继承).
  3. 子类会继承父类的所有 public 的字段和方法.
  4. 对于父类的 private 的字段和方法, 子类中是无法访问的.
  5. 子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用

继承的好处

当我不使用继承时,代码如下:

class Animal { 
    public String name; public Animal(String name) { 
    this.name = name; } public void eat(String food) { 
    System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } } // Cat.java  class Cat { 
    public String name; public Cat(String name) { 
    this.name = name; } public void eat(String food) { 
    System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } } // Bird.java  class Bird { 
    public String name; public Bird(String name) { 
    this.name = name; } public void eat(String food) { 
    System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } public void fly() { 
    System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿"); } } 
class Animal { 
    public String name; public Animal(String name) { 
    this.name = name; } public void eat(String food) { 
    System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } } // Cat.java class Cat extends Animal{ 
    public Cat(String name) { 
    // 使用 super 调用父类的构造方法. super(name); } } // Bird.java class Bird extends Animal{ 
    public Bird(String name) { 
    super(name); } public void fly() { 
    System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿"); } } 

多态

什么是多态

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。

向上转型

Bird bird = new Bird("圆圆"); Animal bird2 = bird; // 或者写成下面的方式 Animal bird2 = new Bird("圆圆"); 

此时 bird2 是一个父类 (Animal) 的引用, 指向一个子类 (Bird) 的实例. 这种写法称为 向上转型.

动态绑定

当子类和父类中出现同名方法的时候, 再去调用会对前面的代码稍加修改,如以下代码:

class Animal { 
    public String name; public Animal(String name) { 
    this.name = name; } public void eat(String food) { 
    System.out.println("我是一只小动物"); System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } } // Cat.java class Cat extends Animal{ 
    public Cat(String name) { 
    super(name); } @Override public void eat(String food) { 
    System.out.println("我是一只小猫"); System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } } // Bird.java class Bird extends Animal{ 
    public Bird(String name) { 
    super(name); } @Override public void eat(String food) { 
    System.out.println("我是一只小鸟"); System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } public void fly() { 
    System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿"); } } public class Main{ 
    public static void main(String[] args){ 
    Animal animal1 = new Animal("圆圆"); animal1.eat("谷子"); System.out.println("===================="); Animal animal2 = new Bird("扁扁"); animal2.eat("谷子"); } } 

java继承和多态
我们发现:
animal1 和 animal2 虽然都是 Animal 类型的引用, 但是 animal1 指向 Animal 类型的实例, animal2 指向Bird 类型的实例.
针对 animal1 和 animal2 分别调用 eat 方法, 发现 animal1.eat() 实际调用了父类的方法, 而animal2.eat() 实际调用了子类的方法.
因此, 在 Java 中, 调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期), 因此称为动态绑定



向下转型

向上转型是子类对象转成父类对象, 向下转型就是父类对象转成子类对象. 相比于向上转型来说, 向下转型没那么常见,但是也有一定的用途.

class Animal { 
    public String name; public Animal(String name) { 
    this.name = name; } public void eat(String food) { 
    System.out.println("我是一只小动物"); System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } } // Cat.java class Cat extends Animal{ 
    public Cat(String name) { 
    super(name); } @Override public void eat(String food) { 
    System.out.println("我是一只小猫"); System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } } // Bird.java class Bird extends Animal{ 
    public Bird(String name) { 
    super(name); } @Override public void eat(String food) { 
    System.out.println("我是一只小鸟"); System.out.println(this.name+"正在干饭,并表示"+food+"很不错"); } public void fly() { 
    System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿"); } } public class Main { 
    public static void main(String[] args) { 
    Animal animal2 = new Bird("扁扁"); animal2.fly(); } } 

在这里插入图片描述
注意:
编译过程中, animal 的类型是 Animal, 此时编译器只知道这个类中有一个 eat 方法, 没有 fly 方法.
虽然 animal 实际引用的是一个 Bird 对象, 但是编译器是以 animal 的类型来查看有哪些方法的。如果需要引用fly方法则需要对它进行向下转型
操作如下



Bird bird = (Bird)animal2; bird.fly(); 

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232315.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • A股和B股的区别_b股是什么股票

    A股和B股的区别_b股是什么股票A股:正式名称是人民币普通股票。它是由我同境内的公司发行,供境内机构、组织或个人(不含台、港、澳投资者)以人民币认购和交易的普通股股票,我国A股股票市场经过几年快速发展,已经初具规模。.B股:正式名

    2022年8月2日
    12
  • 2021ArchLinux安装图文教程「建议收藏」

    2021ArchLinux安装图文教程「建议收藏」主要为以下步骤:1.下载ArchLinux安装镜像并制作U盘启动工具2.开机从U盘启动3.进行联网4.编辑镜像站文件(选择一个比较快的中国镜像源)5.开始分区(UEFI+GPT)6.格式化分区,并挂载7.开始安装基本操作系统8.配置基础系统9.引导系统10.用户管理11.网络配置12.安装桌面环境13.安装完后的工作开始:1.下…

    2022年4月25日
    146
  • idea 2021 11.1 激活码_最新在线免费激活「建议收藏」

    (idea 2021 11.1 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlF6EG2ZUBVX-eyJsaWN…

    2022年3月28日
    133
  • winzip15.0许可证

    winzip15.0许可证

    2021年12月30日
    64
  • git命令-切换分支

    git命令-切换分支git一般有很多分支,我们clone到本地的时候一般都是master分支,那么如何切换到其他分支呢?主要命令如下

    2022年6月20日
    43
  • AD域基础

    AD域基础文章目录AD域基础1.什么是AD域2.AD域和工作组的区别2.1工作组特点及优缺点2.2AD域特点及优缺点3.为什么要做AD域管理4.AD域可以做什么AD域基础1.什么是AD域activedirectory活动目录,指一组服务器和工作站的集合,域中的目录是始终呈激活可用,动态更新的状态域将计算机、用户的账号密码集中放在一个数据库内,使得用户只使用一个账号和密码就能够访问网络中的…

    2022年5月16日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号