Java语法之继承

news2025/1/16 18:49:50

上次给大家分享了Java的封装,今天小编给大家分享面向对象三大特性的第二大特性,也就是继承,fighting~~

目录

 🎄一.继承的概念

🎄1.1为什么需要继承

🎄1.2继承的概念

🎄1.3继承的语法

🎄1.4父类成员的访问

🎄1.5子类构造方法

🎄二.继承的关键字

🎄2.1super和this关键字

🎄2.2final关键字

🎄三.继承的特性

🎄四.总结


🎉一. 继承的概念

1.1 为什么需要继承

生活中的继承:

兔子和羊属于食草动物类,狮子和豹属于食肉动物类。

食草动物和食肉动物又是属于动物类。

所以继承需要符合的关系是:is-a,父类更通用,子类更具体。

虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。


为了方便大家理解,我们举个例子,我们定义一个猫和够,他们都有自己的名字和年龄,这是他们所共有的,但是他们表现出不同的行为,比如狗会汪汪叫,猫会喵喵叫,我们就可以把他们共有的特性抽取出去,写成一个父类,看代码:

 

既然大家有着同样的属性和方法,我们就可以这样改写:

 那么,这里继承的概念就出来了,没错,这就是继承!从这里不难看出,继承实际上就是用来对共性的抽取,实现对代码的复用!


1.2 继承的概念

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类,继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承的格式:

在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

class 父类 {
}
 
class 子类 extends 父类 {
}

1.3继承的语法

语法1.2中就给大家介绍完了,我们这里看一下具体的实现吧,代码:

class Animal {
    public String name;
    public int age;

    public void ageShow() {
        System.out.println(name + "今年" + age + "岁了");
    }
}

class Dog extends Animal {
    public void wangwang() {
        System.out.println(name + "汪汪叫!");
    }
}

class Cat extends Animal {
    public void miaomiao() {
        System.out.println(name + "喵喵叫!");
    }
}

public class Test_2 {
    public static void main(String[] args) {
        Dog dog = new Dog();// dog类中并没有定义任何成员变量,name和age
        dog.name = "旺财";
        dog.age = 3;
        dog.ageShow();
        Cat cat = new Cat();
        cat.name = "咪咪";
        cat.age = 5;
        cat.ageShow();
    }
}

 运行结果:

 注意:

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

 1.4 父类成员的访问

1.4.1 子类中访问父类的成员变量

1)子类和父类不存在同名成员变量

class Demo {
    public int a = 1;
    public int b = 2;
    public int c = 3;
}

class Base extends Demo {
    public void func() {
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

public class Test_3 {
    public static void main(String[] args) {
        Base base = new Base();
        base.func();
    }
}

 2)子类和父类成员变量同名

class Demo {
    public int a = 1;
    public int b = 2;
    public int c = 3;
}

class Base extends Demo {
    int a = 10;
    int b = 20;

    public void func() {
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

public class Test_3 {
    public static void main(String[] args) {
        Base base = new Base();
        base.func();
    }
}


从上面俩个例子我们可以得出:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的

1.4.2 子类中访问父类的成员方法

1)当子类和父类中成员方法名字不同

class Demo {
    public void Basefun1() {
        System.out.println("父类");
    }
}

class Base extends Demo {
    public void Basefun() {
        System.out.println("子类");
    }

    public void func() {
        Basefun();
        Basefun1();
    }
}

public class Test_3 {
    public static void main(String[] args) {
        Base base = new Base();
        base.func();
    }
}

这里也不难看出,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。

2)当子类和父类中成员方法名字相同

class Demo {
    public void Basefun() {
        System.out.println("父类");
    }
}

class Base extends Demo {
    public void Basefun() {
        System.out.println("子类");//优先调用子类自己的方法
    }

    public void func() {
        Basefun();
    }
}

public class Test_3 {
    public static void main(String[] args) {
        Base base = new Base();
        base.func();
    }
}

从输出结果我们可以出,通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。


1.5 子类构造方法

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。我们也可通过构造方法给父类中的成员变量赋值:

class Animal {
    public String name;
    public int age;

    public Animal(String name, int age) {    //构造方法
        this.name = name;
        this.age = age;
    }

    public void ageShow() {
        System.out.println(name + "今年" + age + "岁了");
    }
}

class Dog extends Animal {
    public void wangwang() {
        System.out.println(name + "汪汪叫!");
    }
    public Dog(String name,int age){
        super(name, age);
    }
}

class Cat extends Animal {
    public void miaomiao() {
        System.out.println(name + "喵喵叫!");
    }
 public Cat(String name,int age){
       super(name, age);

    }
}

public class Test_2 {
    public static void main(String[] args) {
        Dog dog = new Dog("旺财",3);
        dog.ageShow();
        dog.wangwang();
        Cat cat = new Cat("咪咪",5);
        cat.ageShow();
        cat.miaomiao();
    }
}

 

 注意:

  • 1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构
  • 造方法
  • 2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的
  • 父类构造方法调用,否则编译失败。
  • 3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
  • 4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

🎉二. 继承的关键字

2.1 super和this关键字

1)super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

2)this关键字:指向自己的引用。

举个例子,这里我们主要介绍super:

class Test1 {
    public int a = 1;
    public int b = 2;

}

class Test2 extends Test1 {
    public int a = 10;
    public int b = 20;

    void fun() {
        System.out.println(a);
        System.out.println(super.b);
    }
}

public class Test_3 {
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.fun();
    }

如果这里我们要通过子类去访问父类中的成员,就需要在成员变量前面加上super关键字,这里我们就可以访问到上述代码中父类b的值了!


2.2 final关键字

final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

final 含义为 "最终的"。

使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:

public class Test_4 {
    final int a = 10;
    a=20;//被final修饰的变量是被密封的,不允许修改的
}
class one {

}
final class tow extends one {

}
class three extends tow{   //被final修饰的类是不能被继承的,属于密封类
    
}

 🎉三. 继承的特性

1)继承的类型

需要注意的是 Java 不支持多继承,但支持多重继承。

 2)继承的特性

  • 子类拥有父类非 private 的属性、方法。

  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

  • 子类可以用自己的方式实现父类的方法。

  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。

  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。


 🎉四. 总结

继承是java中一个重要的语法,小编也是初学者,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!

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

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

相关文章

Android App开发中补间动画的讲解以及实现钟摆动画效果实战(附源码 简单易懂 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、补间动画的种类 Android提供了补间动画,它允许开发者实现某个视图的动态变换,具体包括四种动画效果,分别是灰度动画,平移动画,缩放动画和旋转动画。因为开发者提供…

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

生命无罪,健康万岁,我是laity。 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑; 第二次,当它在空虚时,用爱欲来填充; 第三次,在困难和容易之…

【c++】类和对象

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 3.1类的两种定义方式: 4.类的访问限定符及封装 4.1访问限定符 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 8.this指针 8.1 this指针的引出 8.2 this指针的特性 9.类的6个默认成员函…

深度学习简介及反向传播

Datawhale开源学习,机器学习课程,项目地址:https://github.com/datawhalechina/leeml-notes 之前学习机器学习的时候,总结了三步: define a set of functiongoodness of functionpick the best function 这三步所做的…

机器学习之决策树【西瓜书】

当一个有经验的老农看一个瓜是不是好瓜时,他可能会先看下瓜的颜色,一看是青绿的,心想有可能是好瓜;接着他又看了下根蒂,发现是蜷缩着的,老农微微点头,寻思着五成以上是好瓜;最后他又…

基于51单片机的客车辆超载报警Proteus仿真

资料编号:111 下面是相关功能视频演示: 111-基于51单片机的客车辆超载报警Proteus仿真(源码仿真原理图全套资料)功能如下: 利用单片机设计一个超载检测控制电路。 通过 2 组红外对管(类似电路模拟)检测上车人数和下车…

Flink-水位线的设置以及传递

6.2 水位线 6.2.1 概述 分类 有序流 无序流 判断的时间延迟 延迟时间判定 6.2.2 水位线的设置 分析 DataStream下的assignTimstampsAndWatermarks方法,返回SingleOutputStreamOperator本质还是个算子,传入的参数是WatermarkStrategy的生成策略 但…

C51 - 中断系统

Contents1> 定义2> 作用3> 组成3.1> 中断系统结构3.2> 8个中断源3.3> 中断向量3.4> 中断优先级4> 原理5> 应用1> 定义 中断(interrupt)是指: CPU执行某一程序过程中,由于系统内,或外部某…

【操作文件的系统调用】

目录文件操作系统调用的基本库函数打开文件读取文件写入文件关闭文件应用文件操作代码举例文件操作与进程复制的结合先打开文件再复制进程先进程复制,再进行打开文件缓冲区的知识回顾在上一篇讲述僵尸进程的文章中对文件的系统调用做了一点点的代码讲述,…

day08 微服务保护

1、JMeter压力测试 1.1、安装启动 JMeter 依赖于JDK,所以必须确保当前计算机上已经安装了 JDK,并且配置了环境变量。 Apache Jmeter官网下载,地址:http://jmeter.apache.org/download_jmeter.cgi 解压缩即可使用,目…

【Acwing—单源最短路:建图】

y总说,图论题的难点不在于打板子,而是建图的过程 个人觉得,建图的过程分成以下阶段: 1.确定结点的意义 2.确定边权的意义 结点一般都很显然,但是边权的意义我们一般把它设成对答案(或需要维护的东西&am…

C++入门知识(二)

最近太忙了,发论文写开题,有两周时间没有学习C了,因为都是抽时间来学习,所以本篇博客也是零零散散的,接下来尽量抽时间吧 目录 六、引用 6.1 引用概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用…

并发编程(一)可见性

【并发编程三大特性】: 可见性 有序性 原子性( 较复杂 ) 【线程的可见性】: 【一个例子认识线程的可见性】: import Utils.SleepHelper; import java.io.IOException;public class T01_HelloVolatile {private sta…

Go中的泛型和反射以及序列化

嗨喽,小伙伴们,好几没有更新了,最近在搞一些云原生的东西,docker , k8s 搞得我暂时迷失了方向,不过我举得搞IT吗,就是在不断尝试,搞一下当下最新的技术,不然 … GO中的泛型与继承 搞过java的都知道泛型与继承,在go中也开始搞泛型与继承了(在go1.8之后) 先看代码–>> p…

【记录】PyCharm 安装 preprocess 模块(库)|| 在 PyCharm 中安装 preprocess 失败,故而在 终端 安装

preprocess.py 针对的是处理许多 文件类型。它工作的语言包括:C、Python、 perl、tcl、xml、javascript、css、idl、tex、fortran、php、java、shell 脚本(bash、csh等)和c。预处理可以作为 命令行应用程序和作为python 模块。 目录一、在 Py…

矩阵论复习提纲

矩阵论复习提纲 第一章 矩阵相似变化 1、特征值与特征向量 A ∈ Cnxn 若存在 λ ∈ C 满足 Ax λx 则 λ 为 A 的特征值 可转换为 (λI - A)x 0 特征多项式 :det(λI - A) 特征矩阵: λI - A 2、相似对角化 1. 判断可对角化…

VMware Fusion 13 正式版终于来了

千呼万唤,经历两年之久,VMware终于在Fusion 13正式版中支持了Apple Silicon 版Mac,此次发布的Fusion是Universal版本,也就是一个安装包同时适配Intel Mac及Apple Silicon (M1,M2)Mac。想起我两年…

疑难杂症集合(备忘)

sshd:no hostkeys available 解决过程: #ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key #ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key #/usr/sbin/sshd 如果上述两个文件存在,仍然出现这个错误,那么试试 chmod 600 上述两个文件。之…

01-Python的基本概念

01-Python的基本概念 Python是一种直译式(Interpreted)、面向对象(Object Oriented)的程序语言’它拥有完整的函数库’可以协助轻松地完成许多常见的工作。 所谓的直译式语言是指’直译器(InteIpretor)会将…

诊断故障码(Diagnostic Trouble Code-DTC)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文将由浅入深的介绍DTC(Diagnostic Trouble Code)。 关联文章: $19服务:DTCStatusMask和statusofDTC bit 定义 19服务List 文章目录诊断协议那些事儿DTC(Diagnos…