继承语法详解

news2025/1/18 1:59:03

继承语法详解

  • 一:继承
    • 1:什么是继承
  • 二:访问成员变量
  • 三:访问成员方法
  • 四:访问父类的成员变量和成员方法
    • super关键字
    • super和this关键字的区别
  • 五:子类的构造方法
  • 六:代码块
  • 七:final关键字
  • 八:继承和组合

一:继承

1:什么是继承

继承就是将共性进行提取,实现代码的复用。

class Dog{
    public String name;
    public int age;
    public void eat(){
        System.out.println(name+"正在吃饭");
    }
    public void fun(){
        System.out.println(name+"汪汪叫");
    }
}
class Cat{
    public String name;
    public int age;
    public void eat(){
        System.out.println(name+"正在吃饭");
    }
    public void catchMouse(){
        System.out.println(name+"捉老鼠");
    }
}
public class Test {
    public static void main(String[] args) {

    }
}

在上面的例子中,Dog类和Cat类都有这些成员变量和成员方法

  private String name;
    private int age;
    public void eat(){
        System.out.println(name+"正在吃饭");
    }

那么我们就把这些成员变量和成员方法提取出来,构成一个父类,然后让Dog类和Cat类继承这个父类,而且Dog类和Cat类称为子类。

class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(name+"正在吃饭");
    }
}
class Dog extends Animal{
  
    public void fun(){
        System.out.println(name+"汪汪叫");
    }
}
class Cat extends Animal{
    public void catchMouse(){
        System.out.println(name+"捉老鼠");
    }
}
public class Test {
    public static void main(String[] args) {

    }
}

通过继承,子类将父类的成员变量和成员方法继承下来了
这样就提高了代码的复用性。

二:访问成员变量

在子类方法中或者通过子类对象访问成员变量时:
1:如果访问的成员变量子类中有,父类中没有,访问子类自己的成员变量。

class A{
    public int a=10;
    public int b=20;
    public int c=30;
   // public int d=11;
}
class B extends A{
    public int d=40;
}
public class Test {
    public static void main(String[] args) {
     B b=new B();
        System.out.println(b.d);//子类中有,父类没有,访问子类自己的成员变量

    }
}

2:如果访问的成员变量子类中没有,则访问父类继承下来的,如果父类中也没有则编译错。
在这里插入图片描述

3:如果访问的成员变量与父类的成员变量同名,则优先访问自己的。

class A{
    public int a=10;
    public int b=20;
    public int c=30;
public int d=11;
}
class B extends A{
  public int d=40;
}
public class Test {
    public static void main(String[] args) {
     B b=new B();
        System.out.println("d="+b.d);//子类中有,父类中也有,优先访问自己的

    }
}

三:访问成员方法

在子类方法中或者通过子类对象访问成员方法时:
1:如果访问的成员放方法子类中有,父类中没有,访问子类自己的成员变量。

class A{
    public int a=10;
    public int b=20;
    public int c=30;
   /* public void fun(){
        System.out.println("哈哈");
    }*/
public int d=11;
}
class B extends A{
  public int d=40;
  public void fun(){
      System.out.println("haha");
  }
}
public class Test {

    public static void main(String[] args) {
     B b=new B();
    b.fun();//子类中有,父类中没有,访问子类自己的成员方法

    }
}

2:如果访问的成员方法子类中没有,则访问父类继承下来的,如果父类中也没有则编译错。

class A{
    public int a=10;
    public int b=20;
    public int c=30;
    public void fun(){
        System.out.println("哈哈");
    }
public int d=11;
}
class B extends A{
  public int d=40;
/*  public void fun(){
      System.out.println("haha");
  }*/
}
public class Test {

    public static void main(String[] args) {
     B b=new B();
     //b.fun();//子类中没有,父类中有,访问父类的成员方法

    }
}

在这里插入图片描述3:如果访问的成员方法与父类的成员方法同名,则优先访问自己的。

class A{
    public int a=10;
    public int b=20;
    public int c=30;
    public void fun(){
        System.out.println("哈哈");
    }
public int d=11;
}
class B extends A{
  public int d=40;
  public void fun(){
      System.out.println("haha");
  }
}
public class Test {

    public static void main(String[] args) {
     B b=new B();
    b.fun();//子类中有,父类中有,优先访问子类的成员方法

    }
}

在这里插入图片描述

四:访问父类的成员变量和成员方法

1:当子类中没有要访问的成员变量或成员方法,而父类中有时,则访问父类的成员变量或成员方法。
2:当子类中有要访问的成员变量和成员方法时,我们通过super关键字来访问父类中的成员变量或成员方法。

super关键字

super关键字的作用:在子类方法中访问父类的成员
1:访问父类的成员变量

class A{
    public int a=10;
    public int b=20;
    public int c=30;
    public void fun(){
        System.out.println("哈哈");
    }
    public int d=11;
}
class B extends A{
    public int d=40;
    public void fun(){
      System.out.println("haha");
  }
  public void func(){
      System.out.println(super.d);//访问父类的成员变量
  }
}
public class Test {

    public static void main(String[] args) {
        B b=new B();
         b.func();//11
    }
}

2:访问父类的成员方法

class A{
    public int a=10;
    public int b=20;
    public int c=30;
    public void fun(){
        System.out.println("哈哈");
    }
    public int d=11;
}
class B extends A{
    public int d=40;
    public void fun(){
      System.out.println("haha");
  }
  public void func(){
     super.fun();//访问父类的成员方法
  }
}
public class Test {

    public static void main(String[] args) {
        B b=new B();
         b.func();//11
    }
}

注意:
1:super关键字只能在非静态成员方法中使用
2:在子类方法中,访问父类的成员变量和成员方法。

super和this关键字的区别

相同点:
1:super关键字和this关键字都只能在非静态的成员方法中使用,访问非静态的成员变量和成员方法
2:在构造方法中调用时,必须放在构造方法的
第一行,不能同时存在。
不同点:
1:this是当前对象的引用,访问当前对象的成员变量或成员方法,super访问父类的成员变量或成员方法;
2:在构造方法中,this()用来调用本类构造方法,super()用来调用父类的构造方法
3:构造方法中一定有super()的调用,而this()用户不写则没有

super.父类成员//访问父类的成员变量
super.父类成员方法//访问父类的成员方法
super()            //访调用父类不带参数的构造方法
this.成员变量//访问当前对象的成员变量,优先访问子类的
this.成员方法//访问当前对象的成员方法,优先访问子类的
this()      //调用不带参数的构造方法

五:子类的构造方法

在子类的构造方法中,没有写任何关于父类的构造方法,但在构造子类对象时,先执行父类的构造方法。

class A{
    public int a=10;
    public int b=20;
    public int c=30;
    public int d=11;
    public A() {
        System.out.println("父类的构造方法");
    }
}
class B extends A{
    public int d=40;
    public B() {
        System.out.println("子类的构造方法");
    }
}
public class Test {
    public static void main(String[] args) {
        B b=new B();
    }
}

在这里插入图片描述这是因为子类对象中的成员是由两部分组成的,从父类继承下来的和子类新增加的部分。简单理解就是:父子父子,肯定是先有父,在有子,所以在创建子类对象的时候,先要调用父类的构造方法,将从父类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员变量初始化完整
注意:
1:当父类的构造方法不带参数,那么子类的构造方法中默认有super(),我们可以不写;但如果父类只有带参数的构造方法,那么在子类的构造方法中,必须写上super(参数1,参数2…)
2:子类构造方法中调用父类的构造方法,super()语句必须放在子类构造方法的第一行
3:因为super(),this()在构造方法中都只能出现在第一行,所有不能同时出现

六:代码块

class A{
    public int a=10;
    public int b=20;
    public int c=30;
    public int d=11;
    static{
        System.out.println("父类的静态代码块被执行了---");
    }
    {
        System.out.println("父类的实例代码块被执行了---");
    }
    public A() {
        System.out.println("父类的构造方法被执行了---");
    }
}
class B extends A{
    static{
        System.out.println("子类的静态代码块被执行了---");
    }
    {
        System.out.println("子类的实例代码块被执行了---");
    }
    public int d=40;
    public B() {
        System.out.println("子类的构造方法被执行了---");
    }
}
public class Test {
    public static void main(String[] args) {
        B b=new B();
        System.out.println("--------------------");
        B b1=new B();
    }
}

1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

1:静态代码块先执行,并且只会执行一次,在类加载阶段完成。
2:当有对象创建的时候,才会执行实例代码块,然后再执行构造方法。

七:final关键字

1:final修饰普通变量或成员变量,表示该变量不能被修改;
在这里插入图片描述

2:final修饰类,表示该类不能被继承;
在这里插入图片描述

3:final修饰方法,表示该方法不能被重写
在这里插入图片描述

八:继承和组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法
(诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。
继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
组合表示对象之间是has-a的关系,比如:汽车和其轮胎、发动机、方向盘、车载系统等的关系就应该是组合,因为汽车是有这些部件组成的。

// 轮胎类
class Tire{
// ...
}
// 发动机类
class Engine{
// ...
}
// 车载系统类
class VehicleSystem{
// ...
}
class Car{
private Tire tire; // 可以复用轮胎中的属性和方法
private Engine engine; // 可以复用发动机中的属性和方法
private VehicleSystem vs; // 可以复用车载系统中的属性和方法
// ...
}
// 奔驰是汽车
class Benz extend Car{
// 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
}

组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合。

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

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

相关文章

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

参考:https://www.cnblogs.com/sam-snow-v/p/15917898.html eclipse链接SQL Server出现问题 笔者使用Open JDK 17,SQL Server 2016,项目中使用JPA操作数据库。测试环境没问题,生产环境出现如题所示“驱动程序无法通过使用安全套接…

[Docker]六.Docker自动部署nodejs以及golang项目

一.自动部署nodejs 1.创建node项目相关文件 app.js代码如下: var express require(express);var appexpress();app.get(/,function(req,res){res.send(首页update); }) app.get(/news,function(req,res){res.send(首页); })//docker做端口映射的时候不要指定ip app.listen(30…

浏览器页面被恶意控制时的解决方法

解决360流氓软件控制浏览器页面 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、接受360安全卫士的好意(尽量不要选)二、拒绝360安全卫士的好意(强烈推荐)第…

unity教程

前言 伴随游戏行业的兴起,unity引擎的使用越来越普遍,本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理。12 一、认识unity引擎? 1、Unity相关信息: Unity的诞生:https://www.jianshu.com/p/550…

webpack 中,filename 和 chunkFilename 的区别

filename filename 是一个很常见的配置,就是对应于 entry 里面的输入文件,经过webpack打包后输出文件的文件名。比如说经过下面的配置,生成出来的文件名为 index.min.js。 chunkFilename chunkFilename 指未被列在 entry 中,却…

LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字

上一节实现了 LangChain 实现给动物取名字, 实际上每次给不同的动物取名字,还得修改源代码,这周就用模块化template来实现。 1. 添加promptTemplate from langchain.llms import OpenAI # 导入Langchain库中的OpenAI模块 from langchain.p…

springboot323基于Java的美妆购物网站的设计与实现

交流学习: 更多项目: 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示: ————————————————

资产设备管理系统

dtAsset 是一个固定资产设备管理系统,它专为中小企业的需求而设计。该软件提供了对常用资产设备进行信息化管理的功能,并支持自定义设备类型、导入导出数据、维护工作统计、采购管理、文档管理、运维监控 (使用 Zabbix)、知识库等功能。 主要模块 1.系统…

【Rust】快速教程——闭包与生命周期

前言 你怎么向天生的瞎子说清颜色?怎么用手势向天生的聋子描述声音? 鲜花就在眼前,雷鸣就在头顶,对他们来说却都毫无意义 眼睛看不到,鼻子可以嗅闻花香,耳朵听不见,手指可以触碰窗纸的震动。 犯…

QtCreator13源码windows编译

1.下载QtCreator13源码: https://download.qt.io/snapshots/qtcreator/13.0/13.0.0-beta1/installer_source/latest/qt-creator-opensource-src-13.0.0-beta1.zip 2.下载并安装llvm Release LLVM 17.0.5 llvm/llvm-project GitHub 3.系统 要求: Windows 10 (64…

2023OceanBase年度发布会后,有感

很荣幸收到了OceanBase邀请,于本周四(11月16日)参加了OceanBase年度发布会并参加了DBA老友会,按照理论应该我昨天(星期五)就回到成都了,最迟今天白天就该把文章写出来了,奈何媳妇儿买…

vue2【axios请求】

1:axios作用 axios(发音:艾克c奥斯)是前端圈最火的,专注于数据请求的库。 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中axios的github:https://github.com/axios/axios 中文官网地址…

ESP32网络开发实例-非接触式水位监测

非接触式水位监测 文章目录 非接触式水位监测1、HC-SR04介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将使用 HC-SR04 超声波传感器和 ESP32 创建一个水位监测网络服务器。 这将是一个非接触式水位测量系统。 首先,我们将介绍HC-SR04 与 ESP32 连接。 使用ESP32对超声…

如何去掉图片上的水印?这三种去水印的方法帮你解决!

当我们从网上看到喜欢的图片,想要保存下来作为头像或者插入到工作汇报中时,却发现下载的图片带有水印。这不仅影响了图片的美观,还可能对图片的可用性造成影响。那么,如何去掉图片上的水印呢? 实际上,现在市面上的很多…

【数据结构】10道经典面试题目带你玩转链表

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.移除链表元素 二.反转链表 三.链表的中间结点 四.链表中倒数第K个结点 五.合并两个有序链表 六.链表分割 七.链表的回文结构 八.相交链表 九.环形链表 一.移…

[Vue3] pinia状态管理

文章目录 1.pinia的介绍2.pinia的配置3.state状态管理3.1 state的基本使用3.2 state的访问 4.getters 1.pinia的介绍 Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export …

梦想编织者——Adobe Dreamweaver

今天,我们来谈谈一款在Adobe系列中推出的一款Adobe Dreamweaver,简称“DW”,中文名称 “梦想编织者”,是集网页制作和管理网站于一身的所见即所得网页代码编辑器。 利用对 HTML、CSS、JavaScript等内容的支持,设计人员…

QGIS003:【05高级数字化工具栏】-要素移动、修改、合并操作

摘要:QGIS地图导航工具栏包括激活高级数字化工具、移动要素、旋转要素、缩放要素、简化要素、添加环、添加部件、填充环、删除环、删除部件、重塑要素、偏移曲线、反转线、裁剪/扩展要素、分割要素、分割部件、合并所选要素、合并所选要素的属性、旋转点符号等选项&…

配电房智能监控系统

配电房智能监控系统是一种集成了互联网、物联网、大数据、人工智能等技术的系统,专门用于对配电房进行全方位、实时的监控和管理。主要是在高压柜、变压器及低压柜智能化的基础上,通过分布在配电室内的各类传感器、采集与通信设备,将各种设备…

【产品应用】一体化伺服电机在系留无人机中的应用

一体化伺服电机是一种将电机、驱动器、编码器结合在一起的伺服系统,具有高精度控制、快速响应和高效运行等优点。系留无人机则是一种通过绳索或链条与地面设施连接的无人机,能够实现长时间的稳定悬停和空中作业。 01.设备简介 电源线牵引装置&#xff1…