零基础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 Stringimplements 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. 构造方法没有多态性 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ 广播消息

所谓的广播消息就是发送的一条消息会被多个消费者收到。 ⼴播是向主题&#xff08; topic &#xff09;的所有订阅者发送消息。订阅同⼀个 topic 的多个消费者&#xff0c;能全量收到⽣产者发送的所有消息。 生产者发送了10个order&#xff0c;每个order里面有5个消息&#xff…

.Net IOC理解及代码实现

IOC理解 IoC(Inversion of Control)&#xff1a;即控制反转&#xff0c;这是一种设计思想&#xff0c;指将对象的控制权交给IOC容器&#xff0c;由容器来实现对象的创建、管理&#xff0c;程序员只需要从容器获取想要的对象就可以了。DI(Dependency Injection)&#xff0c;即依…

react的创建与书写

一&#xff1a;创建项目 超全面详细一条龙教程&#xff01;从零搭建React项目全家桶&#xff08;上篇&#xff09; - 知乎 1.创建一个文件夹&#xff0c;shift鼠标右键选择在此处打开powershell 2.为了加速npm下载速度&#xff0c;先把npm设置为淘宝镜像地址。 npm config s…

【微信小游戏学习心得】

这里是引用 微信小游戏学习心得 简介了解微信小游戏理解2d游戏原理数据驱动视图总结 简介 本人通过学习了解微信小游戏&#xff0c;学习微信小游戏&#xff0c;加深了对前端框架&#xff0c;vue和react基于数据驱动视图的理解&#xff0c;及浏览器文档模型和javaScript之间的关…

深究JS底层原理

一、JS中八种数据类型判断方法 在JavaScript中&#xff0c;数据类型分为两大类&#xff1a;基本&#xff08;原始&#xff09;数据类型和引用&#xff08;对象&#xff09;数据类型。 基本数据类型&#xff08;Primitive Data Types&#xff09; 基本数据类型是表示简单的数…

ssm071北京集联软件科技有限公司信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;北京集联软件科技有限公司信息管理系统 \ 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本信息…

Yocto 项目下通过网络更新内核、设备树及模块

Yocto 项目下通过网络更新内核、设备树及模块 前言 在 Yocto 项目的开发过程中&#xff0c;特别是在进行 BSP&#xff08;Board Support Package&#xff09;开发时&#xff0c;经常需要调整特定软件包的版本&#xff0c;修改内核、设备树以及内核模块。然而&#xff0c;每次…

k8s集群安装(kubeadm)

k8s集群安装&#xff08;kubeadm&#xff09; 1、环境准备&#xff08;master和node节点都执行&#xff09;1.1、替换yum源1.2、关闭selinux1.3、永久关闭防火墙1.4、永久关闭swap1.5、修改主机名添加host1.6、时间同步1.7、将桥接的IPv4流量传递到iptables的链1.8、docker安装…

【日常问题排查小技巧-连载】

线上服务CPU飙高排查 先执行 top&#xff0c;找到CPU占用比较高的进程 id&#xff0c;&#xff08;比如 21448&#xff09; jstack 进程 id > show.txt&#xff08;jstack 21448 > show.txt&#xff09; 找到进程中CPU占用比较高的线程&#xff0c;线程 id 转换为 16 进…

您与此网站之间建立的连接不安全解决方法

如果你打开网站&#xff0c;地址栏有警告&#xff0c;点进去是这样的提示&#xff1a;您与此网站之间建立的连接不安全&#xff0c;了解详细信息。 请勿在此网站上输入任何敏感信息&#xff08;例如密码或信用卡信息&#xff09;&#xff0c;因为攻击者可能会盗取这些信息。 …

【与AI+】学习SAP开发有什么渠道可以推荐

前言&#xff1a;好的&#xff0c;我又将开辟一个新的专栏&#xff0c;这个专栏呢&#xff0c;就准备放一些我向AI提问的问题&#xff0c;以及AI的回答。因为感觉真的好方便哈哈哈~ 我不是很确定我的专栏文章内容是否涉及版权&#xff0c;以及也不确定这些整合过的文字是否涉嫌…

江苏博才众创科技产业园集团拟投资10亿元在泰兴打造汽车零部件产业园

2024年11月7日&#xff0c;泰兴市高新技术产业开发区与江苏博才众创科技产业园集团举行新能源汽车零部件智能制造产业园项目签约仪式。 泰兴市高新区党工委委员、管理办副主任王峰表示&#xff1a;高新区是全市项目建设的主阵地&#xff0c;近年来聚焦高端化、智能化、绿色化&a…

【python】Flask

文章目录 1、Flask 介绍2、Flask 实现网页版美颜效果3、参考 1、Flask 介绍 Flask 是一个用 Python 编写的轻量级 Web 应用框架。它设计简单且易于扩展&#xff0c;非常适合小型项目到大型应用的开发。 以下是一些 Flask 库中常用的函数和组件&#xff1a; 一、Flask 应用对…

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历&#xff1a;平时没有听到任何项目延期风险&#xff0c;但到了计划时间却迟迟无法提测……评审时没有任何argue&#xff0c;提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了&#xff0c;然而发现成果达…

新系统如何进行模型环境配置

在机器学习和深度学习中&#xff0c;一个良好的开发环境能够显著提高工作效率。本篇博客将详细介绍如何在新的Linux系统&#xff08;以Ubuntu为例&#xff09;上进行模型环境的配置&#xff0c;包括基础系统设置、Python虚拟环境搭建、常用库的安装以及GPU驱动和CUDA的安装等。…

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…

Am I Isolated:一款安全态势基准测试工具

基于Rust的容器运行时扫描器作为一个容器运行&#xff0c;检测用户容器运行时隔离中的漏洞。 它还提供指导&#xff0c;帮助用户改善运行时环境&#xff0c;以提供更强的隔离保证。 容器的现状是它们并不包含&#xff08;隔离&#xff09;。 容器隔离的缺失在云原生环境中有…

SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介 Blob&#xff08;Binary Large Object&#xff09;是一种用于存储二进制数据的数据类型&#xff0c;在数据库中常用于存储图片、音频和视频等大型&#xff08;大数据量&#xff09;的二进制数据[1-2]。需要注意的是&#xff0c;SQLite中BLOB类型的单对象最…

编写一个基于React的聊天室

前言 此前已经编写了一版后端的im&#xff0c;此次就用其作为服务端&#xff0c;可查看参考资料1 代码 使用WebStorm创建React项目 安装依赖包 PS C:\learn-demo\front\chatroom> npm installadded 183 packages, and audited 184 packages in 16s43 packages are looki…

Javascript事件循环流程分析

基础概念 事件循环&#xff08;Event Loop&#xff09;&#xff1a;事件循环是JavaScript运行时环境中的一个循环机制&#xff0c;它不断地检查调栈用和任务队列。当调用栈为空时&#xff0c;事件循环会首先检查微任务队列&#xff0c;并执行其中的所有任务。只有当微任务队列…