继承语法详解

继承语法详解

  • 一:继承
    • 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.mfbz.cn/a/162302.html

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

相关文章

Vulhub靶场-KIOPTRIX: LEVEL 1

目录 环境配置 端口扫描 漏洞发现 mod_ssl漏洞利用 Samba远程代码执行漏洞利用 环境配置 首先去官网下载靶场导入到虚拟机中 下载地址:Kioptrix: Level 1 (#1) ~ VulnHub 下载完成之后导入到vmware中 这里需要改nat,桥接模式的靶机拿不到IP&…

kubenetes-pod高可用

一、概述 实现pod层面的高可用,需要避免容器进程被终止避免Pod被驱逐: 设置合理的resources.memory limits 防止容器进程被 OOMKill,防止Pod被驱逐;设置合理的emptydir.sizeLimit 并且确保数据写入不超过emptyDir的限制&#xf…

【LeetCode刷题-双指针】--977.有序数组的平方

977.有序数组的平方 方法:双指针 由于数组是升序排序的,如果所有的数都是非负的,那么数组平方后,仍然保持升序,但数组中有负数,将每个数平方后,数组就会降序 需要找到数组中负数与非负数的分界…

Lec14 File systems 笔记

文件系统中核心的数据结构就是inode和file descriptor 分层的文件系统: 在最底层是磁盘,也就是一些实际保存数据的存储设备,正是这些设备提供了持久化存储。在这之上是buffer cache或者说block cache,这些cache可以避免频繁的读…

springboot321基于java的校园服务平台设计与开发

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

前端实现界面切换主题

✨ 目录 ▷ 样式切换主题▷ 变量设置主题 ▷ 样式切换主题 常用的主题切换实现方式之一,就是通过 link 标签的 rel 属性来实现的当 rel 标签的值是 alternate,就代表该样式是可以替换的title 属性要加就全加上或者全不加,因为 title 会导致系…

重生之我是一名程序员 34

哈喽啊大家晚上好! 今天给大家带来的知识是——库函数qsort。首先,给大家介绍一下qsort函数, qsort函数是C标准库中的一种排序函数,用于对数组中的元素进行快速排序。它接受四个参数:待排序数组的基地址,数…

搭建 AI 图像生成器 (SAAS) php laravel

今天来搭一套,AI 图像生成器 是基于 Openai DALLE 2 和 Openai DALLE 3 以及 Stability AI 和稳定扩散 API 构建的脚本,为用户提供了使用简单的提示和大小生成独特自定义图像的可能性。在这个平台上,创意得以快速、高效地实现,借助…

Go vs Rust:文件上传性能比较

在本文中,主要测试并比较了Go—Gin和Rust—Actix之间的多部分文件上传性能。 设置 所有测试都在配备16G内存的 MacBook Pro M1 上执行。 软件版本为: Go v1.20.5Rust v1.70.0 测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能…

Java Web——JavaScript运算符与流程语句

1. 运算符 1.1. 算数运算符 数字是用来计算的,比如:乘法 * 、除法 / 、加法 、减法 - 等等,所以经常和算术运算符一起。 算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余(求模)等 …

【数据分享】2023年我国省市县三级的科技型中小企业数量(Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

2020年06月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 如下图所示脚本运行的结果是()? A:画一条直线 B:画一个三角形 C:画一个圆形 D:画一条虚线 答案:D 第2题 运行如下图所示脚本,下面选项中说法错误的是? A:“笔的颜色”…

使用Redis实现分布式锁

Hi, I’m Shendi 使用Redis实现分布式锁 需求场景 需要使用到分布式锁的场景非常多,例如抢单等并发场景,这里举一个例子。 有一个商品,限量出售100个,一个用户下单,数量就减少一个,当剩下最后一个时&…

[深度学习]卷积神经网络的概念,入门构建(代码实例)

# 不再任何人,任何组织的身上倾注任何的感情,或许这就是能活得更开心的办法 0.写在前面: 卷积神经网络的部分在之前就已经有所接触,这里重新更全面地总结一下关于深度学习中卷积神经网络的部分.并且在这里对如何构建代码,一些新的思想和网络做出一点点补充,同时会持续更新一些…

Mac 安装 protobuf 和Android Studio 使用

1. 安装,执行命令 brew install protoc 2. Mac 错误提示:zsh: command not found: brew解决方法 解决方法:mac 安装homebrew, 用以下命令安装,序列号选择中科大(1)或 阿里云 /bin/zsh -c "$(curl…

掌握Shell:从新手到编程大师的Linux之旅

1 shell介绍 1.1 shell脚本的意义 1.记录命令执行的过程和执行逻辑,以便以后重复执行 2.脚本可以批量处理主机 3.脚本可以定时处理主机 1.2 脚本的创建 #!/bin/bash # 运行脚本时候执行的环境1.3 自动添加脚本说明信息 /etc/vimrc # vim主配置文件 ~/.vimrc # 该…

C语言开发者的利器:gcc编译命令指南

本文主要介绍gcc编译c语言过程,以及常用命令 文章目录 C语言编译过程1. 预处理(Preprocessing):2. 编译(Compiling):3. 汇编(Assembling):4. 链接&#xff08…

适用于 Windows 的 10 个最佳视频转换器:快速转换高清视频

您是否遇到过由于格式不兼容而无法在您的设备上播放视频或电影的情况?您想随意播放从您的相机、GoPro 导入的视频,还是以最合适的格式将它们上传到媒体网站?您的房间里是否有一堆 DVD 光盘,想将它们转换为数字格式以便于播放&…

深度模型压缩研究回顾

深度模型压缩研究回顾 作者:安静到无声 个人主页 目录 深度模型压缩研究回顾推荐专栏 在本节中,主要介绍了目前主流的深度神经网络压缩与加速方法,主要包括轻量化网络设计、参数量化、知识蒸馏、模型剪枝和硬件加速等,其中模型剪…

Linux系统中sh脚本编写

文章目录 Linux系统中sh脚本编写1.在编写sh脚本前了解一下基本语法1.1 if语句单分支双分支多分枝 1.2 for语法 2. 自己写的demo :自动部署前端项目 (自动拉取代码,打包,部署nginx)3.定时执行 shell脚本 Linux系统中sh脚…
最新文章