掌握java中继承

目录

1.概念:

2.使用:

3.super关键字

4.子类构造方法

5.super和this关键字

6.初始化时代码块的执行顺序

7.继承的方式

8.final关键字


1.概念:

是面向对象程序设计代码可以重复使用的重要手段,允许程序员在保持原有类特性的基础上进行扩展,增加新功能,产生新类成为派生类/子类;被继承的类叫父类/基类

那么为什么会有继承呢?

假如我们要定义好多的类,都是描述动物的类,这些类有共同的特点,成员变量都含有动物的名字,年龄;如果每写一个类都要这样定义的话未免有点过于麻烦了;我们可以定义一个父类,包含年龄,名字;以后定义的子类只要继承它就好了;

继承解决的问题是:共性抽取,实现代码复用,然后实现多态。


2.使用:

继承要使用关键字:extends

public class Animal{
    String name;
    int age;
public void eat(){    
    System.out.println(name + "正在吃饭");
}
public void sleep(){
    System.out.println(name + "正在睡觉");
    }
} 
// Dog.java
//Dog继承Animal
public class Dog extends Animal{
    //此时Dog中也有 name;age成员变量,但未显示;
    void bark(){
    System.out.println(name + "汪汪汪~~~");
    }
}

注意:继承后的子类必须要有自己的成员变量或者方法,不然与父类一模一样就没必要继承了


3.super关键字

父类和子类中可能出相同的成员变量或方法,如果想在子类中访问父类成员变量是很难的,java中提供了static关键字;

作用:在子类方法中访问父类成员变量或方法

注意:只能在静态方法中使用,在子类方法中访问父类变量和方法

class testA{
    public int a = 100;
    public int b = 200;
}
class testB extends testA{
    public int a = 10;
    public int b = 20;
}

public class Test {
    public static void main(String[] args) {
        testB testB = new testB();
        System.out.println(testB.a);
        System.out.println(testB.b);
    }
}

输出结果 10 20;

子类继承父类之后,在实例化子类对象的时候要想帮助父类进行构造,初始化父类成员

规则:如果子类与父类有同名的成员变量,优先访问子类成员变量,若子类没有再访问父类,如果父类再没有就报错。

那么如何访问父类中的成员变量呢?

可以在子类中再定义一个方法,用关键字super,因为super只能在子类定义的方法中访问父类变量

class testA{
    public int a = 100;
    public int b = 200;
}
class testB extends testA{
    public int a=10;
    public int b=20;
    public void method(){
        System.out.println(super.a+" "+super.b);
    }
}

public class Test {
    public static void main(String[] args) {
        testB testB = new testB();
        System.out.print(testB.a +" ");
        System.out.println(testB.b);
        testB.method();
    }
}
结果:10 20
     100 200

访问成员方法也是一个道理,但是如果方法的重载,根据参数列表的不同可以不同访问,但是如果构成方法的重写,就要通过super关键字来访问了

class testA{
  public void methodA(){
      System.out.println("testA:methodA()");
  }
  public void methodB(){
      System.out.println("testA:methodB()");
  }
}
class testB extends testA{
    int a = 10;
    public void methodA(int a){
        System.out.println(this.a);
    }
    public void methodB(){
        System.out.println("testB:methodB()");
    }
    public void methodC(){
        super.methodB();
    }
}

public class Test {
    public static void main(String[] args) {
       testB test = new testB();
       test.methodA();
       test.methodA(10);

       test.methodB();
       test.methodC();
    }
}
结果:
testA:methodA()
10
testB:methodB()
testA:methodB()
4.子类构造方法

子类对象构造时,先执行基类方法在调用子类构造方法

class Base{
    public Base(){
        System.out.println("父类构造方法");
    }
}
class Drev extends Base{
    public Drev(){
        System.out.println("子类构造方法");
    }
}
public class Tets {
    public static void main(String[] args) {
        Drev drev = new Drev();
    }
}

结果:
父类构造方法
子类构造方法

说明:在子类方法中,并没有写构造父类方法的代码,为什么会构造子类对象的时候会先调用父类构造代码呢?

因为子类中有两部分代码,一种是继承父类的,还有一种是自己的构造代码,在构造对象时会先调用父类构造方法,将子类中从父类那继承的成员构造完整,再调用子类自己的构造方法将子类的成员初始化完整;

注意:

1.若父类显式定义无参时或者默认构造方法时,子类构造方法中第一行会默认有super(),随后调用子类构造方法;

2.若父类构造方法有参数,此时用户需要为子类显示构造方法,并在子类构造方法中选择合适的父类构造方法调用

3.在子类构造方法中,super()调用父类构造方法时,super()必须是子类构造方法的第一条语句。

4.super()在子类构造方法中只能出现一次,而且不能和this同时出现


5.super和this关键字

super和this都可在成员方法中访问成员变量或成员方法,但有什么区别呢?

class Base1{
    public int a = 1;
    public int b = 2;
}
class Der extends Base1{
    public int c = 3;
    public int a = 10;
    public void test(){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(super.a);
        System.out.println(this.a);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Der der = new Der();
        der.test();
    }
}
结果:
10
2
3
1
10

这个例子可以清晰看到:当子类成员与父类成员有相同名字的时候,会优先访问子类成员变量,如果要可以访问父类成员,需要加上super,访问子类需要用this

相同点:

1.都是关键字

2.都只能在非静态的类成员方法中使用,访问非静态成员方法和字段

3.在构造方法调用时,只能是构造方法的第一条语句,不能同时存在

不同点:

1.this是对当前对象的引用,super是对从父类继承下来的成员的引用

2.非静态成员方法中,super是对父类成员方法的引用,this是对本类成员方法的引用

3.this和super不能同时在构造方法中出现

4.构造方法中一定存在super,不写也有。this不写则没有


6.初始化时代码块的执行顺序

1.实例化代码块和静态代码块,在没有继承时的顺序如下

class Person{
    public String  name;
    public int age;
    public Person(String name,int age){
        this.age=age;
        this.name=name;
        System.out.println("构造方法执行");
    }
    //实例化代码块
    {
        System.out.println("实例化代码块");
    }
    //静态代码块
    static {
        System.out.println("静态代码块");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Person person = new Person("小明",12);
    }
}

结果:
静态代码块
实例化代码块
构造方法执行

在没有继承关系时,静态代码块>实例化代码块>构造方法

1.静态代码块只执行一次,在类加载的时候进行。

2.只有对象创建的时候执行实例化代码,实例化代码完成后会调用构造函数

在继承时,静态代码与实例化代码的关系?

class Person{
        public String  name;
        public int age;
        public Person(String name,int age){
            this.age=age;
            this.name=name;
            System.out.println("构造方法执行");
        }
        //实例化代码块
    {
        System.out.println("实例化代码块");
    }
    //静态代码块
    static {
        System.out.println("静态代码块");
    }
}
class Student extends Person{
    public Student(String name,int age){
        super(name,age);
        System.out.println("Student的构造方法");
    }
    {
        System.out.println("Student的实例化代码");
    }
    static {
        System.out.println("Studentd的静态代码");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Student student = new Student("小红",15);
    }
}
结果
静态代码块
Studentd的静态代码
实例化代码块
构造方法执行
Student的实例化代码
Student的构造方法

规则:

1.父类静态代码块先于子类静态代码块执行,且最早执行

2.父类实例化代码块和它的构造方法紧接着执行

3.然后是子类的实例化代码和它的构造方法

4.第二次实例化对象的时候,静态代码块不会再执行


7.继承的方式

继承有多层继承,单继承,不同类继承同一个类

8.final关键字

final可以修饰成员变量,成员方法或者类

1.修饰成员变量或者字段,表示常量(不能被修改)

final int a = 10;
a = 20;//编译出错

2.修饰类表示不能被继承

final public class Animal {
...
}
public class Bird extends Animal {
...
} /
/ 编译出错
Error:(3, 27) java: 无法从最终com.bit.Animal进行继

平时用的String类型就是fianl修饰的,不能被修改

3.修饰方法表示不能被重写

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

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

相关文章

#stm32外设总结电容触摸按键

BS8116A-3 IRQ 外部中断请求 NMOS输出内部上拉 SCL SDA IIC通信接口 VDD 供电电压2.2-5.5V Ct电容: 0~25 pF 电容越大灵敏度越低 1、 软件使用流程 初始化 将IIC的两个引脚初始化为复用开漏模式 按键引脚设置上拉输入 下降沿触发外部中断 void KEY_Init(void) {//uint8_t …

【Unity】分拣机的数字双胞胎集成到Unity3D开发平台中

Unity HMI 一、前言 该项目的重点是通过OPC UA进行客户端-服务器通信的简单演示,该演示在Unity3D中实现(服务器- B&R Automation PLC,客户端- Unity3D)。该项目展示了数字孪生的分拣机与一些额外的功能。该应用程序使用多线程…

E4991A 射频阻抗/材料分析仪

新利通 E4991A 射频阻抗/材料分析仪 —— 1 MHz到 3 GHz —— 简述 E4991A 射频阻抗/材料分析提供极限阻抗测量性能和功能强大的内置分析功能。它将为元器件和电路设计人员测量 3 GHz 以内的元器件提供创新功能,帮助他们进行研发工作。与反射测量技术不同&#x…

想开发苹果群控软件?先了解这些代码!

随着智能设备的普及,群控软件的需求日益增加,特别是针对苹果设备的群控软件,因其出色的性能和广泛的用户基础,受到了开发者们的青睐。 然而,开发一款功能强大的苹果群控软件并非易事,需要深入了解苹果的开…

Research Agent:具有解决基于大型文本语料库的复杂问题,具备深度多跳推理的能力

原文地址:https://towardsdatascience.com/the-research-agent-4ef8e6f1b741 2023 年 8 月 29 日 问题简介 在2021年,开始应对基于大量文本回答问题的挑战。在预训练transformers之前的时代,这个问题很难破解。 人工智能和大型预训练tran…

k8s常用命令大全

k8s常用的命令 下面是一些常用的Kubernetes(K8s)命令,以及它们的简要说明。这些命令可以帮助您管理和操作Kubernetes集群中的资源。 集群管理命令: kubectl cluster-info: 显示集群的基本信息。 kubectl config use-context &l…

Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器

引言 在当今的软件开发世界中,网络通信已成为不可或缺的一部分。Qt,作为一个跨平台的C框架,为我们提供了强大的网络编程能力。本文将带你深入Qt的网络模块,探索如何使用QNetworkAccessManager、QNetworkRequest和QNetworkReply等核…

Qt插件之输入法插件的构建和使用(二)

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

寡姐出击!《黑寡妇2》AI电影宣传片重磅来袭

寡姐出击!《黑寡妇2》AI电影宣传片重磅来袭 The Black Widow returns, but darkness follows her. Black Widow 2 - Secrets buried deep will rise. A web of lies and deceit threatens her very existence. In the shadows, a new enemy lurks, waiting to strik…

跨网络传输的大致过程+图解(软件虚拟层),ip地址介绍,ip地址和mac地址对比

目录 跨网络传输 引入​​​​​​​ 举例 -- 唐僧西天取经 结论 介绍 ip地址 引入 介绍 类型 公有ip 私有ip 版本 ipv4 ipv6 ip地址和mac地址的唯一性问题 数据包转发的过程 引入 思考 -- 如何跨子网 过程 图解 封装和解包 去掉差异 ip地址/协议的重要…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来,全球范围内…

华为od机试C卷-开源项目热度榜单

1、题目描述 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。 对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue…

利用“定时执行专家”循环执行BAT、VBS、Python脚本——含参数指定功能

目录 一、软件概述 二、VBS脚本执行设置 三、触发器设置 四、功能亮点 五、总结 在自动化办公和日常计算机任务管理中,定时执行脚本是一项非常重要的功能。今天,我将为大家带来一款名为“定时执行专家”的软件的评测,特别是其定时执行VB…

YOLOX论文解读

paper:YOLOX: Exceeding YOLO Series in 2021 official implementation:https://github.com/Megvii-BaseDetection/YOLOX 本文的创新点 本文在YOLOv3的基础上进行了一些改进:包括将检测头进行解耦的decoupled head、从anchor-based转为anc…

Python使用错误总结

【1】cannot import name ‘ParameterSource’ from ‘click.core’ 其根本原因在于是black模块,其模块版本可能过时,升级black模块版本即可: pip install black --upgrade【2】partially initialized module ‘charset_normalizer’ has n…

React-父传子

1.概念 说明:父组件传递数据子组件标签身上绑定属性;子组件接受数据props的参数。props是一个对象,包含父组件传递的所有数据。例如数字、字符串、布尔值、数组、对象、函数、JSX。不允许直接修改父组件传递的数据。 2.例子 // 父传子 // …

社区服务类创业项目推荐:抓住社区商业新机遇

大家好,我是一名90后鲜奶吧创业者,目前在社区经营5年时间,今天我想和大家分享一些关于社区服务类创业项目的推荐,都是这么多年我见证过生意最好的店面。 1、社区便利店: 随着人们生活节奏的加快,对便利购…

刨析数据结构(三)

🌈个人主页:小田爱学编程 🔥 系列专栏:数据结构-带你无脑刨析 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &…

typeorm-入门

简述 typeorm是一个数据库orm框架,在nestjs官网中有提到,可以充分发挥利用typescript的特性,当然也支持js其中涉及的概念包括 DataSource 数据源,Connection 连接数据库Entity 实体,实体类映射数据库表Relation 关系…

《TCP/IP详解 卷一》第13章 TCP连接管理

目录 13.1 引言 13.2 TCP连接的建立与终止 13.2.1 TCP半关闭 13.2.2 同时打开与关闭 13.2.3 初始序列号 13.2.4 例子 13.2.5 连接建立超时 13.2.6 连接与转换器 13.3 TCP 选项 13.3.1 最大段大小选项 13.3.2 选择确认选项 13.3.3 窗口缩放选项 13.3.4 时间戳选项与…