零基础Java第十四期:继承与多态(二)

目录

一、继承

1.1. 继承的方式

1.2. final关键字

 1.3. 继承与组合

1.4. protected关键字

二、多态 

2.1. 多态的概念 

 2.2. 向上转型

2.3. 重写 

2.4. 向下转型 

 2.5. 多态的优缺点


一、继承

1.1. 继承的方式

       猫类可以继承动物类,中华田园猫类可以继承猫类。同样地,在Java当中,可以实现以下几种继承方式:单继承、多层继承、不同类继承同一个类。但是,Java当中不支持多继承。

//单继承
public class A{

}
public class B extends A{

}

//多层继承
public class A{

}
public class B extends A{

}
public class C extends B{

}

//不同类继承同一个类
public class A{

}
public class B extends A{

}
public class C extends A{

} 

1.2. final关键字

(1)final关键字修饰变量或字段,表示常量,也就是不能修改。 

final int a = 10;
a = 20;//这样会报错

(2)final关键字修饰数组 

final int[] array = new int[]{1,2,3};
array = new int[]{10,20,30};//报错
array[0] = 100;//不报错

         final修饰的是array这个引用变量本身,也就是array在栈上的地址不能被修改,就不能再去修改array里面的元素,但我们可以通过array的下标来进行访问。

(3) final修饰类

public final class Animal {
    public int age;
    public String name;
}
public class Dog extends Animal{
    public void bark(){
        System.out.println("汪汪叫");
    }
}

       此时Dog子类里面就会报错,继承关系将不会存在。查看Dog类里面String的源码,就可以看到String被final修饰了。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {

 1.3. 继承与组合

      继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物 组合表示对象之间是apart-of的关系,比如:轮胎是汽车的一部分。

       面向对象中有一个比较重要的原则“多用组合、少用继”或者说“组合优于继承”。组合确实比继承更加灵活,也更有助于代码维护。 

1.4. protected关键字

二、多态 

2.1. 多态的概念 

       通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。比如,猫在吃的行为是吃猫粮,而狗吃的是狗粮。但重要的是,我们要理解多态的思想。

 2.2. 向上转型

(1)直接赋值:父类引用子类对象 

public class Animal {
    public int age;
    public String name;

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void eat(){
        System.out.println("在吃饭");
    }
}

public class Dog extends Animal{
    public void bark(){
        System.out.println("汪汪叫");
    }
    public void wag(){
        System.out.println("摇尾巴");
    }
  public Dog(int age,String name){
        super(age, name);
    }
}
public class Testdemo {
    public static void main(String[] args) {
        Animal animal = new Animal(10,"dahuang" );
        Dog dog = new Dog("xiao",6);
        animal = dog;

//等价于
      Aniaml animal = new Dog;    
    }
}

(2)利用参数的传递

Dog dog = new Dog("大黄",5){
     test1(dog);
}

public static void test1(Animal animal){

}

 (3)返回值传参

public Animal test1(){
     return new Dog("大黄",4);
}

       以Animal作为一个接口,可以返回Dog,也可以返回Cat;参数也是一样可以接受Dog里面的形参,也可以接受Cat里面的形参。

      向上转型的缺点:不能调用到子类特有的方法。给大家举个简单的例子

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void eat(){
        System.out.println("在吃饭");
    }

}

public class Dog extends Animal{
    public void bark(){
        System.out.println("汪汪叫");
    }
}

public class Testdemo {
    public static void main(String[] args) {
        Animal animal= new Dog(6,"小黑");
        animal.eat();
        animal.bark()://这样就会报错
    }
}

有了向上转型,就可以进行多态,但还得有另一个条件,就是实现重写。

2.3. 重写 

       多态实现条件:1. 必须在继承体系下 2. 子类必须要对父类中方法进行重写 3. 通过父类的引用调用重写的方法

        重写也可以成为覆盖。重写的好处在于子类可以根据需要,定义特定 于自己的行为。 也就是说子类能够根据需要实现父类的方法。

       方法重写的规则:1.方法名相同     2.参数列表相同(个数、数据类型、顺序都相同)     3.返回值相同    4.被重写的方法返回值类型可以不同,但是必须是具有父子关系的

       在Dog这个子类,我们不满足于只用父类里的方法,我们就可以通过编译器自动生成一个Override的方法,点击eat,就可以实现重写了。

 

//子类的
@Override
public void eat() {
    super.eat();
}

//父类的
public void eat(){
   System.out.println("在吃饭");
}

       我们来看一下里面的源码,一直到Object类里面。Object就是所有子类的父类,包括Animal这个父类也是默认继承Object这个类里面。

 

       动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体 调用那个类的方法。 

      所以综上所述,动态绑定可以总结到以下两点:1.父类引用必须引用子类对象    2.子类重写父类的方法,通过父类引用调用被重写的方法

     注意:访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为protected父类被static、private修饰的方法、构造方法都不能被重写。

2.4. 向下转型 

 

上面我们讲到了向上转型,子类来调用父类的方法。那么,反过来就是向下转型。

public class Animal {
    public int age;
    public String name;

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }
}
public class Bird extends Animal{
    public Bird(int age, String name) {
        super(age, name);
    }
    public void fly(){
        System.out.println("正在飞");
    }
}

public class Testdemo {
    public static void main(String[] args) {
        Bird bird = animal;//产生报错
    }
}

       这里的错误原因就如同基本类型里面的long类型转成int类型,造成数据的丢失。同样在引用类型里面,大的也不能向小的转化。要想实行向下转型,就得强转。

Bird bird = (Bird)animal;

 再来看下面一段代码

Aniaml animal1 = new Dog(5,"旺财");
Bird bird1 = (Bird)animal1
animal1.fly();

 运行结果如下图所示:

       报错的原因为类型转化异常。Bird与Dog不是同一个类,因为强转而骗过了编译器,所以说,向下转型不安全。如果我们要避免这面这种错误,就可以使用下面的方法。

 if(animal instanceof Bird){
            cat = (Cat)animal;
            cat.mew();
        }
 
        if(animal instanceof Dog){
            dog = (Dog)animal;
            dog.bark();
        }
    }

 2.5. 多态的优缺点

    public static void eatfunc(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Bird bird = new Bird(2,"金丝雀");
        eatfunc(bird);

        Dog dog = new Dog(5,"斯派克");
        eatfunc(dog);
        System.out.println(bird);
        System.out.println(dog);
    }

       以下是运行结果:可以看到Bird和Dog虽然都调用同一个父类里的eat方法,但经过对eat的方法重写之后,就会出现同一行为表现出不同的结果。

 

       优点:1. 能够降低代码的 "圈复杂度", 避免使用大量的 if - else       2.可扩展能力更强。如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低。

       缺陷:代码的运行效率降低。 1. 属性没有多态性 当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性   2. 构造方法没有多态性 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914631.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电销系统:业绩翻倍的秘密武器

在当今竞争激烈的商业环境中&#xff0c;企业都在寻求各种方法来提升业绩。而电销系统正以其强大的功能和优势&#xff0c;成为众多企业实现业绩翻倍的有力工具。 一、高效的客户管理 电销系统能够对客户信息进行全面、系统的管理。从客户的基本资料、联系方式到历史沟通记录、…

CTFhub靶场RCE学习

靶场 eval执行 <?php if (isset($_REQUEST[cmd])) {eval($_REQUEST["cmd"]); } else {highlight_file(__FILE__); } ?> PHP代码显示&#xff0c;要求将命令赋值给cmd然后执行 先查看一下根目录文件 ?cmdsystem("ls");&#xff01;切记最后的分…

软件架构技术深入解析:AOP、系统安全架构、企业集成平台与微服务架构

目录 试题一 论面向方面的编程技术及其应用 解析 试题二 论系统安全架构设计及其应用 解析 试题三 论企业集成平台的理解与应用 解析 &#xff08;1&#xff09;通信服务 &#xff08;2&#xff09;信息集成服务 &#xff08;3&#xff09;应用集成服务 &#xff08;…

计算机网络基础:从IP地址到分层模型

计算机网络 1.计算机网络概述 概述 ​ 计算机网络是指两台或更多的计算机组成的网络&#xff0c;在同一个网络中&#xff0c;任意两台计算机都可以直接通信。互联网是网络的网络&#xff08;Internet&#xff09;&#xff0c;即把很多计算机网络连接起来&#xff0c;形成一个…

SpringCloud篇(服务提供者/消费者)(持续更新迭代)

在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务中&#xff0c;调用其它微服务的服务。&#xff08;调用…

【UML】类图及其六种关系,超详细介绍,细节满满

目录 一、概念 推荐一个画UML相关图的软件&#xff1a;ProcessOn 二、快速介绍类图 1、普通类的类图 2、抽象类的类图 3、接口的类图 三、类与类之间的关系 &#xff08;一&#xff09;、关联关系 1、单向关联 2、双向关联 3、自关联 &#xff08;二&#xff09;、聚…

HTML文件中引入jQuery的库文件

方法一&#xff1a; 1. 首先&#xff0c;在官方网站(https://jquery.com/)上下载最新版本的jQuery库文件&#xff0c;通常是一个名为jquery-x.x.x.min.js的文件。 2. 将下载的jquery-x.x.x.min.js文件保存到你的项目目录中的一个合适的文件夹中&#xff0c;比如将它保存在你的项…

使用Wireshark获取USB HID(Human Interface Device)报告描述符

使用Wireshark选择需要获取的USB进行抓取数据&#xff0c;找到设备&#xff08;host&#xff09;接收信息的数据 第二栏出现hid报告&#xff0c;右击选择复制流 将复制的内容粘贴到USB标准请求及描述符在线分析工具 - USB中文网 进行解析 以图中获取手写板的数据为例&#xff…

ReactPress与WordPress:一场内容管理系统的较量

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress WordPress官网&#xff1a;https://wordpress.org/ ReactPress与WordPress&#xff1a;一场内容管理系统的较量 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为…

DevExpress WinForms中文教程:Data Grid - 如何绑定到实体框架数据源?

在本教程中&#xff0c;您将学习如何将DevExpress WinForms的网格控件绑定到实体框架数据源、如何使用数据注释属性来更改网格显示和管理数据的方式&#xff0c;以及如何将单元格值更改发送回数据源。 P.S&#xff1a;DevExpress WinForms拥有180组件和UI库&#xff0c;能为Wi…

使用多种机器学习调参模型进行二分类建模的全流程,代做分析辅导

使用多种机器学习调参模型进行二分类建模的全流程教程 机器学习全流程分析各个模块用到的总的参数文件 0. 分析参数文件 参数文件名称&#xff1a;total_analysis_params_demo.xlsx &#xff0c;很多分析模块都是这个总的参数文件&#xff0c;我的这个总的参数文件如果有更新…

材质(一)

描述&#xff1a; 材质蓝图&#xff0c;蓝图可以这么定义&#xff0c;是一种数据结构&#xff0c;是一种带有流水线的模糊的数据结构&#xff0c; 材质蓝图也是一种蓝图。 示例操作:

SCI论文数据可视化的在线网址

目录 SCI论文数据可视化的在线网址 EVenn(Evenn):免费 SCI论文数据可视化的在线网址 数据可视化的在线网址,以下是一些值得推荐的资源: ImageGP(ImageGP | ImageGP):该平台可以在线生成常见的线图、柱状图、散点图、箱线图、集合图、热图和直方图等。用户只需粘贴数…

电子应用产品设计方案-4:基于物联网和人工智能的温度控制器设计方案

一、概述 本温度控制器旨在提供高精度、智能化、远程可控的温度调节解决方案&#xff0c;适用于各种工业和民用场景。 二、系统组成 1. 传感器模块 - 采用高精度的数字式温度传感器&#xff0c;如 TMP117&#xff0c;能够提供精确到 0.01C 的温度测量。 - 配置多个传感器分布在…

5G的发展演进

5G发展的驱动力 什么是5G [远程会议&#xff0c;2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下&#xff0c;ITU-R WP 5D#35e远程会议宣布3GPP 5G技术&#xff08;含NB-IoT&#xff09;满足IMT-2020 5G技…

人工智能--自然语言处理简介

上一篇&#xff1a;《人工智能模型训练中的数据之美——探索TFRecord》 序言&#xff1a;自然语言处理&#xff08;NLP&#xff09;是人工智能中的一种技术&#xff0c;专注于理解基于人类语言的内容。它包含了编程技术&#xff0c;用于创建可以理解语言、分类内容&#xff0c…

第8章 利用CSS制作导航菜单

8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平 导航适用性强&#xff0c;几乎所有类型的网站都可以使用&#xff0c;设计难度较低。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在…

企望制造ERP系统 drawGrid.action SQL注入致RCE漏洞复现

0x01 产品简介 企望制造ERP系统是一款专为制造企业设计的企业资源计划(ERP)软件,旨在优化企业的资源配置,提高运营效率,并增强企业的竞争力。系统集成了财务管理、生产管理、供应链管理、客户关系管理(CRM)、人力资源管理(HRM)等多个核心功能模块,能够全面覆盖企业的…

基于JDBC的书库系统(MySQL)

一、创建数据库中的表 1、需求 有一张表叫javabook【创建表要求使用sql语句进行】 表中列 bookid 整数自增类型 表中列 bprice 小数类型 表中列 bookname 字符串类型 长度不能小于50 工程和包要求&#xff1a; domain dao …

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪BD311R 发布时间: 2024-10-23 11:28:42 一、 产品图片&#xff1a; 二、 产品特性&#xff1a; 4G性能&#xff1a;支持2K超高清图传&#xff0c;数据传输不掉帧&#xff0c;更稳定。 独立北…