【Java基础篇 | 面向对象】—— 继承

news2024/12/29 10:10:01

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

继承允许一个类继承另一个类的属性和方法,并且可以在其中添加或修改行为。Java引入继承的目的是为了促进代码重用和构建更加模块化和可扩展的软件系统

目录

  • 一、什么是继承
  • 二、父类成员访问
    • 2.1子类中如何访问父类的成员变量和成员方法
    • 2.2小总结
  • 三、super关键字
    • super注意事项
  • 四、子类构造方法
    • 小总结
  • 五、super和this
  • 六、再谈初始化

一、什么是继承

继承:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类

请看代码:

class Animal{
    public String name;
    public int age;

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

class Dog extends Animal{
    public void barks(){
        System.out.println(name+"汪汪叫"+"年龄:"+age);
    }
}

class Cat extends Animal{

    public void catchMouse(){
        System.out.println(name+"正在抓老鼠");
    }
}

上述代码中:我们把Animal称为父类/基类,把Cat、Dog称为子类/派生类

子类继承父类后,会把父类的属性和方法全部继承。所以我们可以把继承理解为共性的抽取,从而达到代码的复用。

注意:

  • 子类会将父类的成员变量或者成员方法继承子类中。
  • 子类继承父类后,必须添加自己特有的成员来体现出子类与基类的不同,否则就没有必要继承了。
  • 继承最好不要超过3层,否则就会带来可维护的难题。

二、父类成员访问

在继承体系中,子类将父类中的方法和字段继承下来了,下面来看看子类是如何直接访问父类中继承下来的成员的。

2.1子类中如何访问父类的成员变量和成员方法

请看代码演示:


class Base{
    int a;
    int b;
}

public class Derived extends Base{

    int a;
    int c;

    public void method(){
        int a = 10; //这里访问的是子类的a
        int b = 20;
        int c = 20;
        System.out.println(super.a);
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }

	public void methodB(){
		System.out.println("Derived中的methodB()方法");
	}
		public void methodC(){
		methodB(); // 访问子类自己的methodB()
		methodA(); // 访问父类继承的methodA()
		// methodD(); // 编译失败,在整个继承体系中没有发现方法methodD()
	}
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}

运行结果如下:
在这里插入图片描述

2.2小总结

在子类方法中或者通过子类对象访问成员时,遵循如下规则:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
  • 通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用 方法适传递的参数选择合适的方法访问,如果没有则报错;

总之,成员变量的访问遵循就近原则,自己有则优先用自己的,否则就去父类中去找。成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时
再到父类中找,如果父类中也没有则报错。

现在,如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?下面线

三、super关键字

由于某些场景的需要,子类和父类有时会出现相同名称的成员,此时如果我们想要在子类方法中去直接访问父类相同名称的成员是做不到的。所以,java提供了super关键字,以便我们能够访问父类相同成员。

请看下面代码的举例:

class Base{
    int a;
    int b;

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

    public static void staticfunc(){
        System.out.println("Base::staticfunc");
    }
}

public class Derived extends Base{

    int a = 30;
    int b = 40;

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

    public void method(){
        int a = 10; // 为子类中的成员变量a赋值
        int b = 20; // 为子类中的成员变量b赋值
        System.out.println(super.a); // 这里访问的是父类中的成员变量a
        System.out.println(a);       // 这里访问的就是子类中的成员变量a

        super.print(); // 子类方法中调用父类的print函数
        print();       // 子类方法中调用子类的print函数
    }
    
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}

运行结果如下:
在这里插入图片描述

super关键字主要有三种用法:

  • 1.super.data;访问父类的成员变量
  • 2.super.func();访问父类的成员函数
  • 3.super();调用父类的构造函数

super注意事项

第一点:使用类名去访问静态成员

这里我们需要要强调的是,如果我们想要访问父类的静态成员函数的话,我们直接用类名去访问父类中的父类成员方法即可。不建议使用super等引用去访问父类中静态成员函数。
在这里插入图片描述

第二点:super、this关键字只能在非静态成员方法中使用。

在这里插入图片描述
所有的静态成员都是不依赖于对象存在的,因为静态成员在类加载的时候就已经存在,并且在整个程序运行期间都可以被访问和使用。

四、子类构造方法

子类在创建对象时,优先调用父类的构造方法,最后再执行子类的构造方法(我们可以理解为现有父,后有子)。

首先,我们要知道,对象属性(成员变量)的初始化一定要调用构造函数。在子类对象构造完成之前会先帮助父类完成初始化。

我们直接看代码举例,请看:

class person{
    public String name;
    int age;

    // 父类构造
    public person(String name, int age) {
        System.out.println("person(String name, int age)");
        this.name = name;
        this.age = age;
    }
}

public class Student extends person{
    int ID;
    int record;

    //子类构造
    public Student(String name,int age,int ID,int record){
        super(name,age); // 先完成父类成员变量的初始化
        // 完成父类成员变量后再完成子类成员变量的初始化
        this.ID = ID;
        this.record = record;
        System.out.println("Student(int ID,int record)");
    }

    public static void main(String[] args) {
        Student st1 = new Student("Daming",18,123456,100);
    }
}

运行结果如下:
在这里插入图片描述

请请看下面这张图:

在这里插入图片描述

注意,父类构造函数调用结束后并没有完成父类对象的构造,这里帮助子类完成从父类那里继承过来的属性的初始化。

小总结

在子类构造方法中,并没有写任何关于基类构造的代码,但是在构造子类对象时,先执行基类的构造方法,然后执行子类的构造方法,因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。肯定是先有父再有子,所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整。

注意点:

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

五、super和this

super和this都可以在成员方法中访问成员变量和其它成员函数,同时都可以作为构造函数的第一条语句且不可以同时存在。

相同点:

  • 只能在类的非静态成员方法中使用,用来访问非静态成员方法和字段。
  • 在构造方法中调用时,必须是构造方法的第一条语句,且不能同时存在。

不同点:

  • this是当前对象的引用,而super是从子类对象从父类继承下来部分成员的引用。
    在这里插入图片描述
  • 在非静态成员方法中,this用来访问本类的属性,而super用来访问从父类继承下来部分的方法和属性。
  • 在构造方法方面:this()用来调用本类的构造方法,而super()用来调用父类的构造方法。注意二者不能同时出现在构造方法中。
  • 调用方面:this()构造方法我们如果不写的话编译器是一定是不会调用的。但是super()如果我们不写的话,编译器是会自动生成的。

六、再谈初始化

我们来看一下下面代码块在继承关系上的执行顺序:

class Person{
    public String name;
    int age;

    static{
        System.out.println("Person::static{}");
    }

    {
        System.out.println("Person::{}");
    }
    // 父类构造
    public Person(String name, int age) {
        System.out.println("person(String name, int age)");
        this.name = name;
        this.age = age;
    }
}

public class Student extends Person{
    int ID;
    int record;

    static{
        System.out.println("Student::static{}");
    }
    
    {
        System.out.println("Student::{}");
    }

    //子类构造
    public Student(String name,int age,int ID,int record){
        super(name,age); // 先完成父类成员变量的初始化
        // 完成父类成员变量后再完成子类成员变量的初始化
        this.ID = ID;
        this.record = record;
        System.out.println("Student(int ID,int record)");
    }

    public static void main(String[] args) {
        Student st1 = new Student("Daming",18,123456,100);
        System.out.println("==========");
        Student st2 = new Student("Daming",21,456789,150);
    }
}

执行结果如下:

在这里插入图片描述

通过上述代码我们可以得到一些结论:

  • 父类静态代码块优于子类静态代码块执行,静态代码块是最先执行的。
  • 父类实例代码块和父类构造代码块紧接着执行。
  • 子类实例代码块和子类构造代码块紧接着执行。
  • 第二次实例化子类对象的时候,父类和子类的静态代码块都不会执行。

好了,以上就是本文的全部内容。就到这里,再见啦友友们!!!

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

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

相关文章

buuctf crypto 【[HDCTF2019]basic rsa】解题记录

1.打开文件 2.套用脚本 import random from binascii import a2b_hex,b2a_hex p 262248800182277040650192055439906580479 q 262854994239322828547925595487519915551 n p * q def multiplicative_inversr(a,b): x 0 y 1 lx 1 ly 0 oa a ob…

Python项目开发:Flask基于Python的天气数据可视化平台

目录 步骤一:数据获取 步骤二:设置Flask应用程序 步骤三:处理用户输入和数据可视化 步骤四:渲染HTML模板 总结 在这个数字化时代,数据可视化已经成为我们理解和解释信息的重要手段。在这个项目中,我们…

干了三年的功能测试,让我女朋友跑了,太难受了...

简单概括一下 先说一下自己的情况,普通本科,19年通过校招进入深圳某软件公司,干了3年多的功能测试,21年的那会,因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不…

解疑答惑:独立部署类型的商城系统有哪些优势?

数字化时代,电子商务已成为企业蓬勃发展的重要组成部分。 为了满足不断增长的在线购物需求,企业需要一个强大而可靠的商城系统。独立部署类型的商城系统因其独特的优势而备受青睐。下面就独立部署商城系统的优势作一些简单介绍,并解释为什么它…

Python中使用item()方法遍历字典的例子

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 这篇文章主要介绍了Python中使用item()方法遍历字典的例子, for…in这种是Python中最常用的遍历字典的方法了,需要的朋友可以参考下 Python字典的遍历方法有好几种,其中一种是for…in,这个我就…

修改图片尺寸的几个简单方法

修改图片尺寸的几个简单方法~~图片,是我们常用的文件格式,也是日常生活与工作中重要的文件。图片记录了非常多的元素和内容,其中不乏有工作上的内容,也有对一些日常生活的记录。所以说,图片文件对我们来说是非常重要的…

使用轻薄款电子价签,有什么样的改价体验?

在数字化的潮流之中,「轻薄」逐渐成为ESL电子标签的强大优势,让商品管理更高效,货架保持统一高端的形象。云里物里最新发布了一款纤薄ESL电子标签,DS029厚度仅有9.8mm,在36g的轻巧身躯上融入了强大功能,将为…

FirmAFL

FirmAFL使用并改进了Firmdyne模拟方式,并利用AFL对IoT固件实施高通量灰盒Fuzzing。 一、项目简介 FIRM-AFL 是 第一个针对物联网固件的高吞吐量灰盒模糊测试器。 支持mipsel、mipseb和armel三种CPU架构 ,涵盖Firmadyne数据库中90.2%的固件。 FIRM-AFL 解…

学习笔记-配置备份静态路由及优先级

上一个笔记:学习笔记-静态路由配置有来无回导致无法访问目标IP 拓扑图: 书接上回。 模拟R2至R3之间的链路中断,配置备份路由通过R1访问R3。 shutdown掉R2的gi0/0/2端口,模拟链路中断。pingR3的gi0/0/0和R3的loopback0&#xff…

想修复Windows 10屏幕分辨率问题?这里有5种方法供你选择!

​一般来说,如果你愿意,你可以很容易地更改Windows 10计算机的屏幕分辨率。如果你发现你无法在Windows 10中更改分辨率,你可以查看下面的解决方案来解决这个问题。 检查和更改Windows 10屏幕分辨率上 一、你可以右键单击桌面的黑色空间,然后选择“显示设置”。单击“分辨…

循环购模式:美业的新机遇和新挑战

美业是一个高频消费的行业,每个人都想要拥有美丽的容颜和健康的身体。但是,美业的消费门槛往往较高,很多人会觉得美容美发等服务太贵,不敢轻易尝试。如果有一种模式,能够让消费者在享受美业服务的同时,还能…

pdf.js 微信公众号不显示问题

问题1: 在浏览器中能够正常显示, 但是在微信浏览器中不行!解决: 这个是pdf.js 版本问题, 用2.4版本,微信打开就没问题了 问题2: 如何关闭侧边栏? 修改这个地方, 将 -1 改…

Macronix MX25L25645G NOR Flash无法擦除问题分析

1. 问题现象描述 处理器使用的 SAM9X60, 使用的内核版本是 5.10.80,在调试 Macronix MX25L25645G NOR Flash时,发现flash驱动加载成功后,使用 mtd_debug 工具 erase flash时,擦除一整片flash区域时,命令执行速度很快&a…

十 动手学深度学习v2 ——卷积神经网络之NiN + GoogLeNet

文章目录 网络中的网络(NiN)InceptionGoogLeNet总结: 网络中的网络(NiN) NiN块使用卷积层加两个1x1卷积层 后者对每个像素增加了非线性性 NiN使用全局平均池化层来替代VGG和AlexNet中的全连接层 不容易过拟合&#xf…

win10CPU占用率高达100%怎么办

很多小伙伴在打开任务管理器的时候会发现win10CPU的占用率高达了100%,这使得我们的电脑用起来十分的卡顿,那么这个问题该怎么解决呢,这里小编就给大家带来win10CPU占用率高达100%的解决方法,有需要的小伙伴快来看看吧。 win10CPU占…

电子行业云MES解决方案

电子行业MES解决方案主要是针对目前电子生产制造企业面临的产品迭代升级中多品种小批量混线生产、存呆滞问题多;质量检查标准多、售后问题难追溯;生产进度难追踪、车间物料难管控、实际成本难计算等问题,提出的一种切实可行且能降低成本、提高效率的有效…

【视觉检测】电源线圈上的导线弯直与否视觉检测系统软硬件方案

 检测内容 线圈上的导线弯直与否检测系统。  检测要求 检测线圈上的导线有无弯曲,弯曲度由客户自己设定。检测速度5K/8H625PCS/H。  视觉可行性分析 对样品进行了光学实验,并进行图像处理,原则上可以使用机器视觉进行测试测量…

手把手教你maven的安装与配置(windows)

手把手教你maven的安装与配置 一、Maven 是什么二、Maven 的安装1. 下载2. 环境配置 三、Maven 的配置文件1. 本地仓库2. 远程仓库3. 代理服务器4. 服务器认证5. 其他选项6. 配置示例 四、对接IDEA 提起Maven,相信大家并不陌生,对于一些java开发者&#…

C#获取屏幕的分辨率、工作区分辨率

运行结果如下; 由于屏幕的任务栏在侧面所以屏幕宽度变化。 代码如下 private void Form1_Load(object sender, EventArgs e){int SH Screen.PrimaryScreen.Bounds.Height; //1080int SW Screen.PrimaryScreen.Bounds.Width; //1920System.Drawing.Rectangle rec Screen.Get…

从零开始搭建Apache服务器并使用内网穿透技术实现公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…