你一定要学会的Java语法 -- 【继承】

news2024/11/17 7:24:18

书接上回,我们已经学完了类和对象,今天内容可能有一点难,相信自己能跨过这道坎。


目录

一. 继承

1.什么是继承 

2. 继承的概念

3. 继承的语法

4.父类成员访问

子类和父类成员变量同名

 子类和父类成员方法同名

5.super关键字 

6.子类构造方法  

 7.super和this 

【相同点】

【不同点】

8.深入了解初始化 

 9.protected关键字

10.继承方式

11.final关键字

12.继承与组合 


一. 继承

1.什么是继承 

    看字面意思,让我们想到了电视剧中的那些大户人家,家族的后代,会继承家族的资产。那问题来了,java中的继承是什么呢 ?请看下文,让我们来揭开他的神秘面纱。

2. 继承的概念

继承机制 :是面向对象程序设计使代码可以复用的重要手段,主要解决了:共性的抽取,来实现代码的复用

什么时候要用继承,该怎么用呢?

3. 继承的语法

在java中如果要表示类之间的继承关系,需要借助extends 关键字,具体实现如下。

如果说我们要描述,猫和狗,它们都是一种动物,肯定会有共同特点。借助继承我们可以写出如下代码。 

class Animal{
    public String name;
    public int age;
    public String color;
    public void eat(){
        System.out.println(this.name+" 正在吃饭....");
    }
    public void sleep(){
        System.out.println(this.name+" 正在睡觉....");
    }
}
class Dog extends Animal{
    public void bark(){
        System.out.println(this.name+" 正在汪汪叫....");
    }
}
class Cat extends Animal{
    public void mew(){
        System.out.println(this.name+" 正在喵喵叫....");
    }
}
public class test {
    public static void main(String[] args) {
        Dog dog = new Dog();  
// dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的
        dog.name = "旺财";
        dog.eat();
        dog.sleep();
        dog.bark();
        System.out.println("=======");
        Cat cat = new Cat();
        cat.name = "花花";
        cat.eat();
        cat.sleep();
        cat.mew();
    }
}

运行结果:

通过运行结果我们发现,我们根本就没有在Dog这个类里面定义name,age,但是可以访问,原因就是这些都是从Animal这个类当中继承下来的。

 注意:

  • 1. 子类会将父类中的成员变量或者成员方法继承到子类中了
  • 2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

  上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可

【结论】:子类继承了父类之后,子类就可以使用父类的成员变量和成员方法。 通过代码和图片能看出继承最大的作用就是:实现代码复用

4.父类成员访问

大家都知道,在继承体系中子类将父类的方法字段继承下来,子类能直接访问父类,那子类和父类的名字一样呢?

子类和父类成员变量同名

class Base{
    public int a = 1;
    public int b = 2;
}
class Derived extends Base{
    public int a = 10;
    public int b = 20;
    public void print(){
        System.out.println(a);
        System.out.println(b);
    }
}
public class Main {
    public static void main(String[] args) {
         Derived derived = new Derived();
         derived.print();
    }
}

运行结果:

 子类和父类成员方法同名

class methodA{
    public void print(){
        System.out.println("父类的print方法");
    }
}
class methodB extends methodA{
    public void print(){
        System.out.println("子类的print方法");
    }
}
public class test1 {
    public static void main(String[] args) {
         methodB methodB = new methodB();
         methodB.print();
    }
}

运行结果: 

 

 【总结】:成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类找,父类也没有就报错。

那问题是,如果我们想访问父类的成员呢?

5.super关键字 

 在有些场景下,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成
员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

class Base{
    public int a = 1;
    public int b = 2;
}
class Derived extends Base{
    public int a = 10;
    public int b = 20;
    public void print(){
        System.out.println(super.a);
        System.out.println(super.b);
    }
}
public class Main {
    public static void main(String[] args) {
         Derived derived = new Derived();
         derived.print();
    }
}

 运行结果:

 在子类中,如果想要明确访问父类中的成员是,借助super关键字即可。

【注意事项】

  • 1.只能在非静态方法中使用
  • 2.在子类方法中,访问父类的成员方法和变量。 

6.子类构造方法  

  子类对象构造时,需要先调用父类的构造方法,然后执行子类的构造方法(可以理解成先有父后有子)。 

 

运行结果:

一个小栗子

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

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Dog extends Animal{
    public String color;

    public Dog(String name, int age, String color) {
        //调用父类的,带有两个参数的构造方法,来初始化父类当中的成员
        super(name,age); 
        //在子类成员初始化完成之前要帮父类完成初始化
        this.color = color;
    }

    public void bark(){
        System.out.println(this.name+" 正在汪汪叫....");
    }
}
public class test2 {
    public static void main(String[] args) {
        Dog dog = new Dog("阿黄",2,"白色");
    }
}

注意事项:

  •  1.若父类定义无参或者默认的构造方法,在子类构造方法的第一行默认有隐含的super。
  • 2.在子类构造方法中,super( )调用父类构造时,必须在子类构造函数的第一条语句。
  • 3.super( )只能在子类构造方法中出现一次,并且不能和this( )同时出现。

 7.super和this 

super和this都可以在成员方法中用来访问:成员方法,成员变量,构造方法。都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

【相同点】

  • 1. 都是Java中的关键字
  • 2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
  • 3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

【不同点】

  • 1.this是当前对象的引用,super是从父类继承下来的成员引用。 
  •  2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
  •  3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
  •  4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

8.深入了解初始化 

我们知道在没有继承关系时执行顺序是: 静态代码块 >  实例代码块  >  构造代码块

那在继承关系上的执行顺序呢?

class Person{
    public String name;
    public int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        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("子类的构造方法");
    }
    {
        System.out.println("子类的实例");
    }
    static {
        System.out.println("子类的静态方法");
    }
}
public class test3 {
    public static void main(String[] args) {
        Student student1 = new Student("张三",18);
        System.out.println("==========");
        Student student2 = new Student("李四",19);
    }
}

运行结果:

 结论:

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

 9.protected关键字

在类和对象章节中,为了实现封装特性,Java中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问。
 protected叫做受保护的

1.同一个包同一个类可以访问。

2. 同一个包的不同类可以访问。

3.不同包的子类可以访问(请看下图)。

10.继承方式

Java支持以下几种继承方式

1.单继承,2.多层继承,3.不同类继承同一类

Java中不支持多继承 

 建议类之间的继承关系层次不要太复杂,一般我们不希望超过三层的继承关系。

11.final关键字

final关键字可以用来修饰变量,成员方法以及类。

1.修饰变量或字段,表示常量(即不能修改)

 2. 修饰类:被final修饰的类称为密封类,代表该类不能被继承。

 3. 修饰方法:表示该方法不能被重写(后序介绍)

12.继承与组合 

 和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法(诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。

 继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
 组合表示对象之间是has-a的关系,比如:汽车

 汽车和其轮胎、发动机、方向盘、车载系统等的关系就应该是组合,因为汽车是有这些部件组成的。

 

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

好啦今天的分享就到这里啦,下期分享多态! 

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

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

相关文章

POJ 3254 Corn Fields 状态压缩DP(铺砖问题)

一、题目大意 我们要在N * M的田地里种植玉米,有如下限制条件: 1、对已经种植了玉米的位置,它的四个相邻位置都无法继续种植玉米。 2、题目中有说一些块无论如何,都无法种植玉米。 求所有种植玉米的方案数(不种植也…

Vector - CANoe - Vector Hardware Manager基础介绍

经常使用CANoe的人都知道,我们之前使用配置VN系列硬件通道的时候使用的是Vector Hardware Config,非常的方便,不过在Vector Driver Setup驱动版本大于22.14后,为了更好的适用车载以太网相关的配置,以及各个配置之间继承…

kubenetes-kubelet组件

一、kubelet架构 每个节点都运行一个kubelet进程,默认监听10250端口,kubelet作用非常重要,是节点的守护神。 接收并执行 master发来的指令。管理Pod及Pod中的容器。每个kubelet进程会在API Server 上注册节点自身信息,定期向mast…

Java学习_对象

对象在计算机中的执行原理 类和对象的一些注意事项 this关键字 构造器 构造器是一种特殊的方法 : 特殊之处在于,名字必须与所在类的名字一样,而且不能写返回值类型 封装 封装的设计规范:合理隐藏、合理暴露 实体类 成员变量和局部变量的区别 …

程序员的护城河:职业发展的关键元素

目录 1. 技术深度与广度 2. 项目经验与实际操作 3. 沟通与团队协作 4. 持续学习与自我更新 5. 社区参与与开源贡献 6. 创新思维与解决问题的能力 7. 职业规划与自我管理 结语 在科技日新月异的今天,程序员的竞争已经不再仅仅依赖于技术水平,而是…

Citespace的使用

CiteSpace CiteSpace的相关介绍运行CiteSpace CiteSpace的相关介绍 CiteSpace作为一款优秀的文献计量学软件,能够将文献之间的关系以科学知识图谱的方式可视化地展现在我们面前。简单来说,面对海量的文献,CiteSpace能够迅速锁定自己需要关注…

使用openvc进行人脸检测:Haar级联分类器

1 人脸检测介绍 1.1 什么是人脸检测 人脸检测的目标是确定图像或视频中是否存在人脸。如果存在多个面,则每个面都被一个边界框包围,因此我们知道这些面的位置 人脸检测算法的主要目标是准确有效地确定图像或视频中人脸的存在和位置。这些算法分析数据…

如何从零开始手写一个消息中间件(从宏观角度理解消息中间件的技术原理)

如何从零开始手写一个消息中间件(从宏观角度理解消息中间件的技术原理) 什么是消息中间件消息中间件的作用逐一拆解消息中间件的核心技术消息中间件核心技术总览IOBIONIOIO多路复用AIOIO多路复用详细分析selectpollepoll Java中的IO多路复用 协议序列化消…

阿里云严重故障,影响阿里系、淘宝、饿了么、语雀等都崩了...

作者:JavaPub 编程学习一条龙:http://luxian.javapub.net.cn 就在一年一度的双十一剁手节火热进行时,阿里云服务出现了严重故障。 关键是前不久刚发生了语雀事件,不了解的朋友阅读这里 阿里语雀突发P0级事故,一度崩溃…

ASP.NETWeb开发(C#版)-day1-C#基础+实操

目录 .NET实操:创建项目执行 C#基础语法数据类型变量实操001_变量如何在一个解决方案 中创建另一个项目实操002结构实操003-if else实操004-多分支多行注释按钮实操:循环 面向对象基础如何在同一个项目下创建新的.cs文件实操-类的定义与访问实操-练习实操…

基于springboot实现驾校管理系统项目【项目源码】

基于springboot实现驾校管理系统演示 JAVA简介 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&#xff0…

加班把数据库重构完毕

加班把数据库重构完毕 本文的数据库重构是基于 clickhouse 时序非关系型的数据库。该数据库适合存储股票数据,速度快,一般查询都是 ms 级别,不需要异步查询更新界面 ui。 达到目标效果:数据表随便删除,重新拉数据以及指…

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码:https://github.com/lishuangquan1987/XFYun.SparkChat 工具效果截图: 支持流式输出: 其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请,免费的。 申请地址:https://xinghuo.xfyun.cn/ 注册之…

NetSuite 固定资产报表自定义原理及应用

NetSuite固定资产模块一直处于功能迭代更新中,目前23.2的版本能够支持报表的局部自定义,比如增加原值或已折旧期间,甚至固定资产自定义字段等。但是当我们在实际项目中,会遇到一些挑战,例如: 固定资产原值…

Java Web——前端HTML入门

目录 HTML&CSS3&JavaScript简述 1. HTML概念 2. 超文本 3. 标记语言 4. HTML基础结构 5. HTML基础词汇 6. HTML语法规则 7. VS Code 推荐使用的插件 8. 在线帮助文档 HTML&CSS3&JavaScript简述 HTML 主要用于网页主体结构的搭建,像一个毛坯…

【FAQ】Gradle开发问题汇总

1. buildSrc依赖Spring Denpendency时报错 来自预编译脚本的插件请求不能包含版本号。请从有问题的请求中删除该版本,并确保包含所请求插件io.spring.dependency-management的模块是一个实现依赖项 解决方案 https://www.5axxw.com/questions/content/uqw0grhttps:/…

怎么做到高性能网络IO?

为什么要做高性能网络IO。主要是解决c10,c10M问题 最开始的时候我们走的内核协议栈,走内核协议栈其实性能比较低,因为我们之前介绍的时候需要拷贝两次 但是我们采用用户态协议栈可以少拷贝一次,可以大大提高效率, 步骤…

阿里系APP崩了?回应来了!

最近,阿里云遭遇了一场可怕的疑似故障,引起了广泛的关注和热议。各种消息纷传,阿里云盘崩了,淘宝又崩了,闲鱼也崩了,连钉钉也不幸中招。这一系列故障让人不禁发问:阿里系的APP都崩了&#xff0c…

计算机中丢失msvcr120.dll文件怎么修复?找不到msvcr120.dll五种完美修复方案

今天我想和大家分享的是关于“msvcr120.dll丢失的问题的5个解决方法”。在我们日常的工作生活中,或许大家都曾遇到过这样的问题,那么,了解它的解决方法是非常必要的。 首先,让我们来了解一下msvcr120.dll是什么文件。简单来说&am…

零基础算法还原01以及使用python和JS还原C++部分细节

题目一 使用jadx 打开algorithmbase_10.apk JAVA层 使用Frida获取先生成的随机字符串 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // 定义一个名为hook_js的JavaScript函数 function hook_js(){ // 使用Java.perform()函数来…