Java进阶学习笔记10——子类构造器

news2024/12/27 22:11:30

子类构造器的特点:

子类的全部构造器,都会先调用父类的构造器,再执行自己。

子类会继承父类的数据,可能还会使用父类的数据。所以,子类初始化之前,一定先要完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认就是super();

package cn.ensource.d14_extends_constructor;

class F{
    public F() {
        System.out.println("F类构造器执行了!");
    }
}

class Z extends F{
    public Z() {
        super();
        System.out.println("Z类无参构造器执行了!");
    }

    public Z(String name) {
        super();
        System.out.println("Z类有参构造器执行了!");
    }
}


public class Test {
    public static void main(String[] args) {
        // 目标:先认识子类构造器的特点,再掌握子类构造器的应用场景
        Z z1 = new Z();
        Z z2 = new Z("播妞");
    }
}

执行结果:

可见,不管是子类有参构造器,还是子类无参构造器,都是先调用父类构造器,然后再执行子类构造器。

其实,在子类构造器中,默认会有一个super()存在,不管你调用,还是不调用,都调用这个方法。

如果父类没有默认的无参数构造器呢?

package cn.ensource.d14_extends_constructor;

class F{
    public F(String name, int age) {
        System.out.println("F类有参构造器执行了!");
    }
}

class Z extends F{
    public Z() {
        super("播妞", 20);    // 默认存在的
        System.out.println("Z类无参构造器执行了!");
    }

    public Z(String name) {
        super("播妞", 20);    // 默认存在的
        System.out.println("Z类有参构造器执行了!");
    }
}


public class Test {
    public static void main(String[] args) {
        // 目标:先认识子类构造器的特点,再掌握子类构造器的应用场景
        Z z1 = new Z();
        Z z2 = new Z("播妞");
    }
}

在子类的构造器中调用super()方法。

常见的应用场景:

为什么要这么干?有什么应用场景呢?

package cn.ensource.d14_extends_constructor;



public class Test2 {
    public static void main(String[] args) {
        // 目标:搞清楚子类构造器为什么要调用父类构造器,有啥应用场景
        Teacher t = new Teacher("李四", 30, "Java");
        System.out.println(t.getName() + " " + t.getAge() + " " + t.getSkill());
    }
}

class Teacher extends People {
    private String skill;

    public Teacher(String name, int age, String skill) {
        super(name, age);    // 在子类构造器中调父类的有参构造器
        this.skill = skill;  // 为当前对象的skill进行赋值
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}

class People {
    private String name;
    private int age;

    public People() {
    }

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在子类的构造器中调用super("播仔", 20)调用父类的有参构造器。

然后再在子类构造器中为当前对象(this)的skill进行赋值。

super:代表父类存储空间的标识。可以理解为父类对象的引用。

父类存储空间是在方法区中,如下图:

子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先进行初始化赋值,再回来把对象里包含子类这部分的数据也进行初始化赋值。

然后t.getter方法,都是到子类和父类中调用相应的的getter方法。

补充知识:

this(...)调用兄弟构造器。

在任意类的构造器中,都可以通过this(...)去调用该类的其他构造器。

package cn.ensource.d14_extends_constructor;

public class Test3 {
    public static void main(String[] args) {
        // 目标:掌握类的构造器中,通过this(...)调用兄弟构造器
        Student s1 = new Student("李四", 26, "家里蹲大学");

        // 需求:如果学生没有填写学校,那么学校默认就是黑马程序员
        Student s2 = new Student("张三", 38);

        System.out.println(s2.getName());
        System.out.println(s2.getAge());
        System.out.println(s2.getSchoolName());
    }
}

class Student {
    private String name;
    private int age;
    private String schoolName;

    public Student() {

    }

    public Student(String name, int age) {
//        this.name = name;
//        this.age = age;
//        this.schoolName = "黑马程序员";
        this(name, age, "黑马程序员");
    }

    public Student(String name, int age, String schoolName) {
        this.name = name;
        this.age = age;
        this.schoolName = schoolName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }
}

小知识点:

不能在构造器中即写this(...),又写super(...)。这样写是有问题的。

如果父类没有无参构造方法,只有带参构造方法。该怎么办?

1、在父类中提供一个无参构造方法;

2、通过使用super关键字去显示的调用父类的带参构造方法。

推荐是自己给出无参构造方法。

 

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

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

相关文章

【pyspark速成专家】7_SparkSQL编程1

目录 一,RDD,DataFrame和DataSet对比 二,创建DataFrame 本节将介绍SparkSQL编程基本概念和基本用法。 不同于RDD编程的命令式编程范式,SparkSQL编程是一种声明式编程范式,我们可以通过SQL语句或者调用DataFrame的相…

2024Spring> HNU-计算机系统-实验4-Buflab-导引+验收

前言 称不上导引了,因为验收已经结束了。主要是最近比较忙,在准备期末考试。周五晚上才开始看实验,自己跟着做了一遍实验,感觉难度还是比bomblab要低的,但是如果用心做的话对于栈帧的理解确实能上几个档次。 实验参考…

ClickHouse 24.4 版本发布说明

本文字数:13148;估计阅读时间:33 分钟 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 新的一个月意味着新版本的发布! 发布概要 本次ClickHouse 24.4版本包含了13个新功能🎁…

List Control控件绑定变量

创建基于对话框的mfc项目 添加 List Control控件 右击控件,选择“添加变量” 在初始化对话框代码中增加一些代码 BOOL CMFCApplication3Dlg::OnInitDialog() { //...// TODO: 在此添加额外的初始化代码DWORD dwStyle m_programLangList.GetExtendedStyle(); …

程序员的那些经典段子

哈喽,大家好,我是明智~ 本周咱们已经解决了在面试中经常碰到的OOM问题: 《美团一面,发生OOM了,程序还能继续运行吗?》 《美团一面:碰到过OOM吗?你是怎么处理的&#xff1…

【Linux】Linux的基本指令_1

文章目录 二、基本指令1. whoami 和 who2. pwd3. ls4. clear5. mkdir 和 cd6. touch7. rmdir 和 rm 未完待续 二、基本指令 直接在命令行的末尾(# 后面)输入指令即可。在学习Linux指令的过程中,还会穿插一些关于Linux的知识点。 1. whoami …

AI助力垃圾分类开启智慧环保新时代,基于卷积神经网络模型开发实践垃圾分类识别系统

在快节奏的现代生活中,垃圾分类已经成为一项重要的环保举措。然而,面对日益复杂的垃圾种类和繁多的分类标准,许多人感到困惑和无奈。幸运的是,随着人工智能技术的飞速发展,AI深度学习模型为垃圾分类带来了革命性的变化…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 详解

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…

嵌入式全栈开发学习笔记---C语言笔试复习大全21(编程题25~30)

目录 25、实现字符串的排序。(输入hello world good,输出good hello world,其中字符串个数任意) 26、输入两个有序的字符串(从小到大),合并成一个有序的字符串。(输入cdhxyz fjln …

利用EAS自动生成数据模型和sql脚本

EAS适用于敏捷开发中小系统,这节主要讲解EAS对应的模型和数据库脚本输出应用。 在这个应用程序中,用户可自定义实体模型和枚举模型,只要选择相应的实体或者枚举进行右击添加即可。 解决方案参数设定,在解决方案的设定中可设置项目名称、通用语言,命名空间和输出位置。 连…

Python+Flask+Pandas怎样实现任意时间范围的对比数据报表

话不多说,有图有源码: 1.上图 2.因为是低代码的,只能发重要有用的代码片段了 实现思路:1)获取指定时间范围内的数据:2)df合并 #----------年份替换----------------for syear in range(int(byear),int(eyear)1):start_datestr(syear)strbdate[4:]end_datestr(syear)stredate…

2024-05-22 VS2022使用modules

点击 <C 语言编程核心突破> 快速C语言入门 VS2022使用modules 前言一、准备二、使用其一, 用VS installer 安装模块:第二个选项就是, 与你的代码一同编译std模块, 这个非常简单, 但是也有坑. 总结 前言 要解决问题: 使用VS2022开启modules. 想到的思路: 跟着官方文档整…

Linux更改系统中的root密码

Linux里面的root密码忘记了怎么办&#xff1f; 1 更改系统中的 root 密码 &#xff08;1&#xff09;键盘 CtrlAltT 快捷键打开终端。 &#xff08;2&#xff09;在终端窗口中输入以下代码&#xff1a; sudo passwd root &#xff08;3&#xff09;输入锁屏密码 &#xf…

kali下载zsteg和stegpy

1.kali下载zsteg 从 GitHub 上克隆zsteg到kali git clone https://github.com/zed-0xff/zsteg 切换目录 cd zsteg 用于安装名为 zsteg 的 Ruby Gem 包 gem install zsteg 2.kali下载stegpy 下载网站内的stegpy-master压缩包GitCode - 开发者的代码家园 并拉到kali中 切换到s…

String s1 = new String(“abc“);这句话创建了几个字符串对象?

首先&#xff0c;我们来聊聊Java中的字符串&#xff08;String&#xff09;。在Java里&#xff0c;字符串是不可变的&#xff0c;也就是说&#xff0c;一旦我们创建了一个字符串&#xff0c;它的值就不能更改了。这涉及到几个核心概念&#xff1a; 字符串常量池&#xff1a;这是…

Pytorch深度学习实践笔记5

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 目录 1 Linear Regress…

Java 登录错误次数限制,用户禁登1小时

手机号验证码登录&#xff0c;验证码输入错误次数超5次封禁 Overridepublic boolean checkCaptcha(String phoneNum, String captcha) {String codeNum (String) redisTemplate.opsForValue().get(UserCacheNames.USER_CAPTCHA phoneNum);if (codeNum null) {throw new Wan…

2024 ISCC pwn wp

iscc 练武pwn 总结第一周chaosISCC_easyFlagshopping 第二周ISCC_easyISCC_Uheapheap 第三周miaoYour_programeazy_heap 总结 总体感觉iscc考察的题目都挺基础的&#xff0c;在目前这种比赛的大环境下&#xff0c;仍然出这种&#xff0c;比较基础的题目&#xff0c;实在是难得…

24李林跌落神坛,880还刷吗?还是换1000、900、660?

“李林今年跌落神坛了&#xff01;” “全是固定题型没新题&#xff0c;结果今年考的全是新题。” 880是“老真题的神”&#xff0c; 遇到24年&#xff0c;冷门考点多&#xff0c;计算量又大&#xff0c;就不灵了。 但“老真题”&#xff0c;还是得刷。就像往年真题是要刷的…

开源大模型与闭源大模型

概述 开源大模型和闭源大模型是两种常见的大模型类型&#xff0c;它们在以下方面存在差异&#xff1a; 开放性&#xff1a; 开源大模型&#xff1a;代码和模型结构是公开可用的&#xff0c;任何人都可以访问、修改和使用。闭源大模型&#xff1a;模型的代码和结构是私有的&…