首页 > 编程语言 >Java中子类构造时可以做的事

Java中子类构造时可以做的事

时间:2024-11-21 16:32:24浏览次数:1  
标签:初始化 Java 构造方法 子类 构造 中子 Child 父类 public

在 Java 中,当子类的构造方法运行时,第一行默认会调用父类的构造方法(隐式调用 super()),或者由显式调用指定的父类构造方法(如 super(args...))。这是 Java 语言规范的一部分,目的是确保在子类实例化之前,父类部分的初始化能够完成。

虽然这种调用机制是固定的,但仍有一些方式可以在构造方法中实现特殊操作,以下是一些可以考虑的方式:


1. 在父类构造方法中进行特殊操作

如果你需要在子类实例化时做一些全局初始化操作,可以把逻辑放在父类的构造方法中。子类调用构造方法时,父类的逻辑会优先执行。

class Parent {
    public Parent() {
        System.out.println("父类构造方法执行");
        initialize();
    }

    protected void initialize() {
        // 父类初始化逻辑
        System.out.println("父类初始化逻辑");
    }
}

class Child extends Parent {
    private String name;

    public Child(String name) {
        this.name = name;
        System.out.println("子类构造方法执行");
    }

    @Override
    protected void initialize() {
        // 子类定制化的初始化逻辑
        System.out.println("子类初始化逻辑:" + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child("测试");
    }
}

输出

父类构造方法执行
子类初始化逻辑:null
子类构造方法执行

2. 显式调用父类的其他构造方法

如果父类有多个构造方法,可以显式调用特定的构造方法,并根据需要传递参数。

class Parent {
    public Parent() {
        System.out.println("父类无参构造方法");
    }

    public Parent(String msg) {
        System.out.println("父类有参构造方法:" + msg);
    }
}

class Child extends Parent {
    public Child() {
        super("来自子类的消息");
        System.out.println("子类构造方法");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

输出

父类有参构造方法:来自子类的消息
子类构造方法

3. 静态块或初始化块

如果需要在调用父类构造方法之前执行一些逻辑,可以利用静态块实例初始化块来实现。这些块在构造方法调用之前执行。

class Parent {
    public Parent() {
        System.out.println("父类构造方法");
    }
}

class Child extends Parent {
    static {
        System.out.println("子类静态初始化块");
    }

    {
        System.out.println("子类实例初始化块");
    }

    public Child() {
        System.out.println("子类构造方法");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

输出

子类静态初始化块
父类构造方法
子类实例初始化块
子类构造方法

4. 使用工厂方法或静态方法

如果需要更灵活的初始化逻辑,可以通过工厂方法或静态方法构造实例,在方法中执行特殊操作。

class Parent {
    public Parent(String msg) {
        System.out.println("父类构造方法:" + msg);
    }
}

class Child extends Parent {
    private String data;

    private Child(String data) {
        super("父类初始化");
        this.data = data;
        System.out.println("子类构造方法:" + data);
    }

    public static Child createChild(String data) {
        System.out.println("工厂方法逻辑");
        // 在构造前执行其他操作
        return new Child(data);
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = Child.createChild("测试数据");
    }
}

输出

工厂方法逻辑
父类构造方法:父类初始化
子类构造方法:测试数据

注意事项

  1. super() 必须是构造方法中的第一行:这意味着你无法在构造方法中将父类构造方法的调用推迟到其他操作之后。
  2. 避免在构造方法中调用重写方法:如果子类重写了父类的某个方法,在父类构造方法中调用时可能会导致意外行为(如前例中 initialize 方法的行为)。
  3. 初始化块和静态块不能访问构造方法参数:它们在构造方法执行之前运行。

通过这些方式,可以实现更灵活的初始化和特殊操作。

标签:初始化,Java,构造方法,子类,构造,中子,Child,父类,public
From: https://www.cnblogs.com/lm02/p/18561032

相关文章

  • 【老白学 Java】Warship v2.0(一)
    Warshipv2.0(一)文章来源:《HeadFirstJava》修炼感悟。上一篇,简版的「Warship」项目终于完工。从本章开始,老白准备在简版基础上进行升级改造,逐步打造出「Warshipv2.0」。开篇前,老白先介绍一下「数组列表」对象,它是这个项目不可缺少的重要工具。如果师兄们感兴趣,可以......
  • Java批量解析微信dat文件,微信图片
    以下是java代码,直接可用,不用手动计算异或值此处的jdk版本需要1.8以上…,另外两个参数(解析文件路径和输出路径)需要改成自己的哦~此处的原理是判断图片文件的十六进制特征码。第一种:weChatImgRevert.javapackagecom;importjava.io.File;importjava.io.FileInputStream;impor......
  • Java从入门到放弃之 IO (三)------- 绝对看的懂,看不懂欢迎私信
    Java从入门到放弃之IO(三)Java从入门到放弃之IO(三)装饰器模式问题背景解决方案就是引入装饰器模式IO流关闭问题Java从入门到放弃之IO(三)装饰器模式在上一篇我们引入了装饰器模式的定义。那么这一章我们进一步,装饰器模式解决什么问题?以及为什么JavaIO要使用装......
  • JAVA ClassLoader机制
    概要说明注:本篇文章是网上多篇文章的缝合,把我觉得写的不错的,对我理解ClassLoader有帮助的内容写到博客中,同时我尽量让一些学Java安全的同学更详细的学习ClassLoader。参考文章(1):https://www.cnblogs.com/luckforefforts/p/13642685.html-简短,可以快速了解ClassLoader概念和双......
  • Java爬虫与淘宝API接口:高效数据采集的结合
    目录引言一、淘宝API接口介绍二、请求淘宝API接口三、解析淘宝API返回的JSON数据四、存储淘宝商品数据五、注意事项结语引言在数字化时代,数据的价值日益凸显,尤其是在电商领域。淘宝作为中国最大的电商平台之一,拥有海量的商品数据。对于开发者而言,如何高效、准确地从......
  • Language:Solution must be completed in Java assignment contact me
    AssignmentDetailscotactmeonhelp-assignmentwe-we-chatDuedate:6thofDecember2024Language:SolutionmustbecompletedinJavaGameDescriptionDefenderisaclassicarcadegamewheretheplayerfiesaspaceshipdestroyingalieninvadersoverap......
  • java.lang.IllegalArgumentException: Unsupported class file major version xx解决
    在一次项目打包中遇到了这个问题,这个问题的本质是打包时,你依赖的包或这些依赖的间接依赖中含有高于当前项目构建jdk版本编译出来的类,导致打包失败。1.majorversion和jdk各版本对应关系可以自行搜索,当前主要版本的对应关系是c:55对应java11majorversion:52对应java8maj......
  • Java初识
    Java概述Java由来Java是由JamesGosling设计的。最初是为了网联化的市场前景而开启的项目计划,起名为Oak,但这个市场并不友好,这个项目就被搁置了;但在1994年,该项目小组看到了浏览器在未来的发展前景,于是决定将OaK应用于万维网,就这样Java诞生了。随着Java的发展,体系越来越完......
  • 【力扣热题100】[Java版] 刷题笔记-234. 回文链表
    题目:234.回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。解题思路回文定义:是指正读和反读都相同的字符序列。将链表数据获取出来,再通过前后指针向中间遍历,数据一致,则是回文;如果不一致则不是回文。......
  • Java基础面试:关键字与注释
    Java中的关键字什么是关键字Java关键字是Java语言中预先定义好的、具有特殊含义的标识符。这些标识符在程序中有固定的用途,不能用作变量名、方法名或类名。Java中共有53个特殊标识符,其中包括48个关键字,2个保留字,外加3个特殊直接量。关键字分类及说明分类关键......