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;
    }
    @Override
    public 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;
    }
}

         

 

 

 

 

 

 

 

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

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

相关文章

Topaz Video AI for mac 视频增强软件

Topaz Video AI for Mac是一款专为Mac用户设计的视频增强软件,它利用先进的人工智能技术和机器学习算法,为用户提供卓越的视频编辑和增强体验。 软件下载:Topaz Video AI for mac v4.2.2激活版 这款软件能够快速提高视频的清晰度、色彩饱和度…

Vue2版本封装公共echarts的监听方法

#注意 : 因为一个页面有多个图表,所以封装一个公共的js文件,方便后续使用。 适用于Vue2版本,粘贴即用即可。 1、echartsMixin.js文件如下 // echartsMixin.js import echarts from echartsexport default {data() {return {myC…

翻译 《The Old New Thing》 - Why is a registry file called a “hive“?

Why is a registry file called a “hive“?https://devblogs.microsoft.com/oldnewthing/20030808-00/?p42943 为什么注册表文件被称为‘蜂巢’? Raymond Chen 2003年8月8日 分享一个没用的知识: 话说有一位 Windows NT 的开发者十分讨厌蜜蜂。于是&a…

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面:**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境(IDE)和Object Pascal语言进行软件开发时,采用…

C#属性显示

功能&#xff1a; 显示对象的属性&#xff0c;包括可显示属性、可编辑属性、及不可编辑属性。 1、MainWindow.xaml <Window x:Class"FlowChart.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sche…

Topaz Gigapixel AI for Mac 图像放大软件

Topaz Gigapixel AI for Mac是一款专为Mac用户设计的智能图像放大软件。它采用了人工智能技术&#xff0c;特别是深度学习算法&#xff0c;以提高图像的分辨率和质量&#xff0c;使得图像在放大后仍能保持清晰的细节。这款软件的特点在于其能够将低分辨率的图片放大至高分辨率&…

跃然纸上的灵感再现,手绘风格的开源绘图白板工具:Excalidraw

Excalidraw&#xff1a;即绘即思&#xff0c;直观呈现未来流程图&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 在撰写文章或构建演示案例的过程中&#xff0c;为了增强视觉表现力和信息传达深度&#xff0c;适时融入图表或图形显得至关重要。Excalidraw作为一款基于…

【2024系统架构设计】案例分析- 4 嵌入式

目录 一 基础知识 二 真题 一 基础知识 1 基本概念 ◆系统可靠性是系统在规定的时间内及规定的环境条件下,完成规定功能的能力,也就是系统无故障运行的概率。或者,可靠性是软件系统在应用或系统错误面前,在意外或错误使用的情况下维持软件系统的功能特性的基本能力。

使用mysql官网软件包安装mysql

确定你的操作系统&#xff0c;我的是Centos myqsl 所有安装包的地址&#xff1a;https://repo.mysql.com/yum/ 如果你是使用rpm安装你可以到对应的版本里面找到对应的包。 mysql 发行包的地址&#xff1a;http://repo.mysql.com/ 在这里你可以找到对应的发布包安装。 这里使用y…

基于单片机的二维码LCD显示控制设计

**单片机设计介绍&#xff0c;基于单片机的二维码LCD显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的二维码LCD显示控制设计是一个集硬件、软件与通信于一体的综合性项目。此设计的主要目标是实现单片机…

CAPL实现关闭TCP连接的几种方式以及它们的区别

在讲正文前,我们有必要复习下关闭TCP连接的过程:四次挥手。 假设A和B建立TCP连接并进行数据传输,当A的数据发送完后,需要主动发起断开连接的请求: A发送FIN报文,发起断开连接的请求B收到FIN报文后,首先回复ACK确认报文B把自己的数据发送完,发送FIN报文,发起断开连接的…

A Little Is Enough: Circumventing Defenses For Distributed Learning

联邦学习的攻击方法&#xff1a;LIE 简单的总结&#xff0c;只是为了能快速想起来这个方法。 无目标攻击 例如总共50个客户端&#xff0c;有24个恶意客户端&#xff0c;那么这个时候&#xff0c;他需要拉拢2个良性客户端 计算 50 − 24 − 2 50 − 24 0.923 \frac{50-24-2}{…

选择全球直播专线考虑的因素有哪些?

当你需要选择全球直播专线时&#xff0c;有一些关键因素需要考虑&#xff0c;以确保你的直播服务能够稳定、低延迟且高质量。以下是一些建议&#xff0c;帮助你选择合适的全球直播专线&#xff1a; 地理位置&#xff1a;选择距离你目标观众较近的直播专线&#xff0c;以减少网络…

ElasticSearch学习篇11_ANNS之基于图的NSW、HNSW算法

前言 往期博客ElasticSearch学习篇9_文本相似度计算方法现状以及基于改进的 Jaccard 算法代码实现与效果测评_elasticsearch 文字相似度实现方法-CSDN博客 根据论文对文本相似搜索现状做了一个简要总结&#xff0c;然后对论文提到的改进杰卡德算法做了实现&#xff0c;并结合业…

云服务器8核32G配置租用优惠价格94元/月、1362元一年

8核32G云服务器京东云轻量云主机价格94元1个月、282元3个月、673元6个月、1362元一年&#xff0c;配置8C32G-100G SSD系统盘-10M带宽-2000G月流量 华北-北京&#xff0c;京东云优惠活动 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 8核32G云服务器京东云轻量云主机价…

【C语言】结构体详解 (二) 内存函数、结构体传参

目录 1、 结构体的内存对齐 1.1、对齐规则 1.2、练习1、练习2&#xff08;演示对齐规则1、2、3、4&#xff09; 2、为什么存在内存对齐 2.1、平台原因&#xff08;移植原因&#xff09; 2.2、性能原因 2.3、那么如何即满足对齐&#xff0c;又要节省空间呢&#xff1f; …

虚拟机体验 mac、Linux、Windows,老游戏和软件再也没有兼容问题

安装虚拟机 下载好 VMwareWorkstation Pro 后运行安装程序&#xff0c;根据流程完成安装&#xff1b; 勾选许可协议&#xff0c;点击「下一步」&#xff1b; 这里注意更改安装路径&#xff0c;最好选择 C 盘以外的其他磁盘&#xff0c;选择好后点击「下一步」&#xff1b; 这里…

使用filezilla连接Ubuntu22.04虚拟机

获取电脑IP和虚拟机IP ① 在windows下ctrlR再输入cmd&#xff0c;打开指令窗口&#xff0c;输入 ipconfig 虚拟机连接电脑用的是NAT模式&#xff0c;故看VMnet8的IP地址 ② 查看虚拟机IP地址 终端输入 ifconfig 如果没安装&#xff0c;按提示安装net-tools sudo apt install …

解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题

文章目录 前言一、遇到的问题二、解决方案三、重新编译安装四、验证五、资源自取 前言 本文记录在 GNU RadioUSRP 实现 OFDM 收发时&#xff0c;在接收端 QPSK 星座图映射无“抖动”问题的解决方法&#xff0c; 一、遇到的问题 我遇到的问题是&#xff0c;现在搭建的 OFDM 模…

顶顶通呼叫中心中间件-声音编码自适应配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-声音编码自适应配置方法讲解(mod_cti基于FreeSWITCH) 声音编码自适应介绍 声音编码自适应&#xff0c;通常在语音通信和音频处理领域中指的是一种能够根据信号特性和传输环境自动调整编码参数的技术。其目的是在不同的网络状况和音质要求下&#xff0c;…