java中的继承和组合

继承

        在java中继承指的是让类与类之间产生父子关系,被继承的类叫做父类或者基类、超类,继承的类叫做子类或者派生类。这里所说的继承和现实生活中的继承可以理解为同一个意思。当子类继承父类时,子类就能使用父类之中的非私有成员,包括成员变量和成员方法。这里要注意的是子类能使用的父类成员变量和成员方法都只能是非私有的,比如父类中用private修饰的成员方法和成员变量就无法在子类中被使用。这个就像某位富豪死后他的后代会继承他的财产,不过在这些财产中有一些是富豪的私人物品,富豪用了一把单独的锁给锁起来了,即使他的后代继承了所有权,但仍然无法使用箱子里被锁起来的动西。

        在java中,当使用继承后就能够发现,子类继承父类后如果要实现父类的某些功能,如果没有特别强调,那是不需要重新写代码的,这就体现了继承的优点,能够提高代码的复用性,,简化了代码结构,提高了代码的可维护性,但是显而易见,当使用继承时,可以理解为子类和父类相通了,因此父类代码的封装性被打破了,提高了代码的耦合性。

继承的实现

        在java中,通过关键字extends来实现子类对父类的继承。extends的意思不是继承而是扩展。这里需要说的是为什么子类是父类的扩展呢?其实子类肯定是有自己的成员变量和成员方法的,当子类继承父类之后,在拥有父类的成员变量和成员方法外,还有属于它自己的成员方法和成员变量,这样一看,子类的范围就比父类的范围更大了,因此叫扩展。此外,这个就像一个石油老板的儿子又加入了房地产开发一样,他不仅拥有了石油老板的石油产业还拥有了自己的房地产产业,那么对于这个家族来说吗,产业在这个石油老板儿子的手下被扩展了。

        在java中,实现扩展的语法为:

                        class 父类{

                                //….

                        }

                        class 子类 extends 父类{

                                //…..

                        }

        需要注意的是,如果没有明确说明写的类是哪一个类的子类,那么默认为这个类是Object类的子类,也就是说,在java中程序员写的类都是Object类的子类。

方法重写

        方法重写是指在子类中出现和父类中相同的方法的现象,又叫方法的复写和方法的覆盖。具体表象为,当子类中要用到父类中的方法,但是方法的功能和父类中方法的功能在实现上又有差异时会将父类中的这个方法重新写一遍,并在实现细节上做出修改。也是由于这个原因,要求在子类中进行方法重写时方法明、参数列表以及返回值的类型必须和父类中的相同。

        这里需要特别注意,方法重载和方法重写的区别,由于只有一字之差故而时常被混淆。根据方法重载中提到的区分方法的方式能够发现,方法重载针对的是方法名相同的不同方法来说的,而且这些方法在同一个类中,而对于方法重写,由于方法名和参数列表均相同,因此可以认为他们是同一个方法,并且方法重写是子类中对父类的方法重写,也就是说并不在同一个类中发生,也就是说,方法重写和方法重载是啷个完全不相同的概念。

        此处,举一个例子用来演示方法的重写。定义一个Animal类,在这个类中定义一个eat方法。然后定义一个Dog类,狗的eat方法实现要比动物的细节,所有的动物都需要进食,不过狗狗能具体到需要吃什么,所以在Dog类中重写eat方法。

        这时在测试类中创建一个Dog类对象,对象名为布鲁斯,调用eat方法,打印结果应该是“布鲁斯吃骨头”。

package jiangchen.practice1;//定义父类Animal
public class Animal {//姓名private String name;public void setName(String name) {this.name = name;}public String getName() {return name;}public Animal() {}public Animal(String name) {this.name = name;}
//成员方法public void eat(){System.out.println("吃饭");}
}
package jiangchen.practice1;//子类
public class Dog extends Animal {private String name;public void setName(String name){this.name = name;}public String getName(){return name;}@Overridepublic void eat() {System.out.println(getName()+"吃骨头");}public void watch(){System.out.println("狗会看家");}
}
package jiangchen.practice1;public class Test {public static void main(String[] args) {Dog d = new Dog();d.setName("布鲁斯");showAnimal(d);}public static void showAnimal(Animal an){if(an instanceof Dog){Dog dog = (Dog)an;dog.watch();}an.eat();}
}

instanceof运算符

        instanceof运算符是二元运算符,他的左边是对象,右边是类。当左边的对象是右边的类或者子类创建的对象时,返回true否则返回false。这里要注意,当instanceof运算符的右边是左边对象对应的类或者这个类的父类时,返回的值都是true。比如在上面的的Dog类和Animal类中,定义一个属于Dog类的对象dog,运用运算符instanceof进行运算dog instanceof Dog 和 dog instandeof Animal,返回的值都是true。

super关键字

         super关键字在java中可以理解成直接父类对象的引用,可以通过super关键字来访问父类中被子类覆盖的方法或者属性。

        在java中,当编写一个子类用来继承父类时,父类中的数据并没有被替换,而是被子类的数据覆盖了,这样在子类中,当调用和父类中名称相同的变量或者方法时如果没有使用关键字super则优先调用子类中的变量或者方法。

        比如在下面这个程序中,创建了一个父类,父类中有一个成员变量叫value,给其赋值为100,在这个父类的子类中也创建一个成员变量value,给其赋值为200,当没有使用super关键字强调时调用的时子类中的value,当使用super关键字强调时调用的时父类中的value。

public class SuperTest {public static void main(String[] args) {new ChildClass().f();}
}
class FatherClass{public int value;public void f(){value = 100;System.out.println("FathersClass.value="+value);}}
class ChildClass extends FatherClass{public int value;public void f(){super.f();value = 200;System.out.println("ChildClass.value="+value);System.out.println(value);System.out.println(super.value);}
}

import org.w3c.dom.ls.LSOutput;public class TestSuper01 {public static void main(String[] args) {System.out.println("开始创建一个ChildClass01对象……");new ChildClass01();}
}
class FatherClass01{public  FatherClass01(){System.out.println("创建一个FstherClass01类");}}
class ChildClass01 extends FatherClass01 {public  ChildClass01(){System.out.println("创建一个ChildClass类");}
}

        在关于super关键字的使用中,还需要说明的是super()。这个方法是系统会默认加在子类的构造方法中的,也就是在写子类构造方法是,第一行就隐藏了super();代码,这个代码是用来调用父类的无参构造方法的。如果要调用父类的有参构造方法,只要在super()的括号内的输入父类含参构造方法中的参数即可。这里要特别注意的是,无论调用的父类构造方法是否含有参数,都只能放在子类构造方法的第一行。

        这里用一个例子来说明super()的运用。如下代码所示。从他的运行结果中能看出,在创建子类对象的时候,即使没有调用super()方法,在调用子类的构造器时,也会先调用父类的无参构造器。

import org.w3c.dom.ls.LSOutput;public class TestSuper01 {public static void main(String[] args) {System.out.println("开始创建一个ChildClass01对象……");new ChildClass01();}
}
class FatherClass01{public  FatherClass01(){System.out.println("创建一个FstherClass01类");}/* FatherClass01(int a){System.out.println("创建一个带参数的父类构造器");}*/}
class ChildClass01 extends FatherClass01 {public  ChildClass01(){//super();不用特意编写,系统自动加上的//super(3)若要调用含参构造器,只需要调用super()时输入对应参数即可System.out.println("创建一个ChildClass类");}}

组合

        在java中,使用继承的主要目的是为了提高代码的复用性,但如果仅仅是为了提高代码的复用性,组合也可以实现这个目的,并且相对于继承来说,组合更加灵活。只是需要强调,继承关系有很强的逻辑关系,比如动物和人类就是所属关系,但是组合就没有这种逻辑关系,只要一个类想用另一个类中的方法或者成员变量就可通过组合来实现,不需要二者之间存在所属关系,就相当于使用组合可以将人和植物这两个在生物学上完全不同的物种关联起来。也因为如此,继承和组合只能说是各有优缺点,并不存在孰优孰劣的问题。

        那么在java中怎么实现组合呢?其实只要在需要使用组合的类中新建一个属于另一个类的对象就能将另一个类中的属性和方法在这个类中使用了,也就是所谓的组合。比如下面的这个程序所示。

        在这个程序中,可以发现在Student类中先通过Person person = new Person();这个代码实现了将Person类和Student类组合起来,接下来在Student类中要使用Person类中的方法和成员变量只需要通过调用就可以实现。比如在Student的构造方法中的his.person.name = name;这行代码。

package com.zuhe.demo;
//组合:将父类的对象作为子类的属性,子类通过调用这个属性来获得父类的属性和方法
public class ZhHeDemo {public static void main(String[] args) {Student student = new Student("张三",180,"机械");System.out.println(student.person.name);System.out.println(student.person.height);System.out.println(student.major);}
}class Person{String name;int height;public void rest(){System.out.println("休息一会儿");}
}
class Student /*extends Person*/{Person person = new Person();String major;public Student(String name,int height,String major){//天然拥有父类的属性//this.person.rest();this.person.name = name;this.person.height = height;this.major = major;}
}

         

 

 

 

 

 

 

 

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

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

相关文章

(十二)图像的Sobel梯度锐化

环境:Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章: (一)PythonGDAL实现BSQ,BIP,BIL格式的相互转换 (二)BSQ,BIL,BIP存储格式的相互转换算法 (三…

图论- 最小生成树

一、最小生成树-prim算法 1.1 最小生成树概念 一幅图可以有很多不同的生成树,比如下面这幅图,红色的边就组成了两棵不同的生成树: 对于加权图,每条边都有权重(用最小生成树算法的现实场景中,图的边权重…

UI的设计

一、RGB888的显示 即红色,绿色,蓝色都为8位,即通常说的24位色。可以很好显示各种过渡颜色。从硬件上,R、G、B三基色的连接线各需要有8根,即24根数据线;软件上存储的数据量也需要24位,即3个字节&…

主干网络篇 | YOLOv8更换主干网络之EfficientNet

前言:Hello大家好,我是小哥谈。EfficientNet是一种高效的卷积神经网络架构,由Mingxing Tan和Quoc V. Le在2019年提出,其设计思想是在不增加计算复杂度的情况下提高模型的准确性。它引入了一个称为"复合系数"的概念,该系数用于同时缩放网络的深度、宽度和分辨率。…

RabbitMQ 延时消息实现

1. 实现方式 1. 设置队列过期时间:延迟队列消息过期 死信队列,所有消息过期时间一致 2. 设置消息的过期时间:此种方式下有缺陷,MQ只会判断队列第一条消息是否过期,会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…

光伏发电量预测(Python代码,CNN结合LSTM,TensorFlow框架)

1.数据集(开始位置),数据集免费下载链接:https://download.csdn.net/download/qq_40840797/89051099 数据集一共8列,第一列是时间,特征列一共有6列:"WindSpeed" - 风速 "Sunshi…

C++template之类模版进一步了解

前言:这一篇是在我的上一篇文章的基础上,再进一步所写的。 链接:CTemplate<>模版的介绍及深度解析-CSDN博客 一、类模板实例化 1.非类型模版参数 类型模版参数:就是跟在 class后面或者typename后的类型 非…

visual studio报:引发的异常:“System.DllNotFoundException”(位于 ConsoleCAN1.exe 中)

最近在重构CAN通信的代码,把论文中的java转为C#实现,由于某种原因,java不能复现,所以转为c#。 然而c#的重构过程遇到许多问题,因为两种语言的编程方式、线程等等实现上有所差异。 其中一个错误: 引发的异…

vue3+threejs新手从零开发卡牌游戏(二十一):添加战斗与生命值关联逻辑

首先将双方玩家的HP存入store中,stores/common.ts代码如下: import { ref, computed } from vue import { defineStore } from piniaexport const useCommonStore defineStore(common, () > {const _font ref() // 字体const p1HP ref(4000) // 己…

三菱Q系列PLC以太网TCP通讯FB块源码

三菱Q系列PLC的tcp通讯,客户端和服务器两个变量好用的FB块,调用块就可以实现通讯连接,不需要自己写程序,简单配置引脚就可以。该块还集成了断网,连接错误,发送接收数据错误报警等功能。具体功能见下面介绍.…

sql Tuning Advisor启用导致业务性能问题

数据库每天晚上10点后业务性能很卡,大量的insert被堵塞,查询等待事件发现有大量的“library cache lock”和“cursor: pin S wait on X”。 22:00数据库的统计信息开始收集, Sql Tuning Advisor堵塞了统计信息的收集,等待事件是“…

利用HIVE的窗口函数进行SQL查询中出现的问题记录

student_info部分数据 score_info部分数据 course_info 1、问题复现 --完整SQL selectsti.stu_id,sti.stu_name,concat_ws(",",collect_set(ci.course_name)) over(partition by sti.stu_id) fromstudent_info sti left joinscore_info sci onsti.stu_idsci.stu_id l…

mysql之MyBatis核心工作原理

MyBatis核心工作原理 一、源码环境 1.手动编译源码 工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释,我们可以自己来从官网下载源码编译生成对应的Jar包,然后上传到本地maven仓库,再引用这个Jar。大家可以自行去官…

matlab 点云可视化(6)——点云按强度进行可视化

目录 一、功能概述1、算法概述2、主要函数二、代码示例三、结果展示四、参考链接本文由CSDN点云侠原创原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、功能概述 1、算法概述 点云按强度进行可视化 2、主要函数

绿联 安装Uptime Kuma - 一款开源的服务器监控和状态检测工具

Uptime Kuma 功能简介 Uptime Kuma 是一款开源的服务器监控和状态检测工具,它帮助您跟踪服务器的可用性、性能和健康状态。 主要功能: 服务器监控 Uptime Kuma 可以监控多个服务器,包括 Web 服务器、数据库服务器、应用程序服务器等。 它会定…

Antd Vue3 使用 Anchor 锚点组件记录

项目场景 客户要求做一个表单页面&#xff0c;表单数据分为三步&#xff0c;每一步骤是一个单独的 Vue 组件&#xff0c;表单上方需要使用锚点组件实现锚点定位到每一步的功能。 代码总览 <template><div class"guided-form-content-wrapper"><!-- …

初步了解C++

目录 一&#xff1a;什么是C&#xff1f; 二.C发展史 三:C关键字 四&#xff1a;命名空间 4.1命名空间的介绍 4.2命名空间的使用 4.3命名空间的使用 4.3.1使用作用域限定符 4.3.2 使用using将命名空间的某个成员引入 4.3.3使用using把整个命名空间展开 4.4命名空…

每天学习一个Linux命令之scp

每天学习一个Linux命令之scp 在Linux系统中&#xff0c;scp&#xff08;Secure Copy&#xff09;是一个用于在本地主机和远程主机之间进行文件传输的命令行工具。它基于SSH协议&#xff0c;通过加密方式传输文件&#xff0c;确保传输的安全性和完整性。scp命令非常强大且使用简…

【蓝桥杯选拔赛真题50】C++简易炸弹超人 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C简易炸弹超人 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C简易炸弹超人 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 有一块矩形游戏场地&#x…

聊聊k8s服务发现的优缺点

序 本文主要研究一下使用k8s服务发现的优缺点 spring cloud vs kubernetes 这里有张spring cloud与kubernetes的对比&#xff0c;如果将微服务部署到kubernetes上面&#xff0c;二者有不少功能是重复的&#xff0c;可否精简。 这里主要是讲述一下如果不使用独立的服务发现&am…