Java学习教程,从入门到精通,Java 构造方法语法的知识点总结(22)

1、Java 构造函数语法知识点及案例

构造函数语法知识点
  1. 定义与用途

    • 构造函数是一种特殊的方法,用于在创建对象时初始化对象的状态。
    • 它没有返回类型,包括 void 也不允许。
    • 构造函数的名称必须与类名完全相同。
  2. 特点

    • 每个类可以有一个或多个构造函数,这些构造函数通过参数列表进行重载。
    • 构造函数没有返回值,因此不能使用 return 语句。
    • 构造函数是在创建对象时自动调用的,不需要显式调用。
  3. 调用规则

    • 使用 new 关键字创建对象时,会调用相应的构造函数。
    • 子类的构造函数默认会调用父类的无参构造函数,除非在子类的构造函数中显式地使用 super 关键字调用父类的其他构造函数。
  4. 使用 this 关键字

    • 在一个构造函数中,可以使用 this 关键字来调用同一个类中的其他构造函数。
    • this 关键字必须在构造函数的第一行使用。
  5. 构造代码块

    • 构造代码块在每次创建对象时都会执行,且优先于构造函数执行。
    • 它可以用于初始化所有对象共有的属性。
2、案例

以下是一个详细的 Java 构造函数示例,展示了上述知识点的应用:

// 父类
public class Person {private String name;private int age;// 无参构造函数public Person() {System.out.println("调用了Person的无参构造函数");// 可以在这里进行默认初始化this.name = "Unknown";this.age = 0;}// 一个参数的构造函数public Person(String name) {this(); // 调用无参构造函数System.out.println("调用了Person的一个参数的构造函数");this.name = name;}// 两个参数的构造函数public Person(String name, int age) {// 可以直接初始化,也可以调用其他构造函数// this(name); // 调用一个参数的构造函数(也可以选择这种方式)System.out.println("调用了Person的两个参数的构造函数");this.name = name;this.age = age;}// Getter 和 Setter 方法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 class Student extends Person {private String studentId;// 子类的无参构造函数,会隐式调用父类的无参构造函数public Student() {super(); // 显式调用父类的无参构造函数(可以省略,因为默认就是调用父类的无参构造函数)System.out.println("调用了Student的无参构造函数");}// 子类的一个参数的构造函数,显式调用父类的一个参数的构造函数public Student(String name) {super(name); // 调用父类的一个参数的构造函数System.out.println("调用了Student的一个参数的构造函数");}// 子类的两个参数的构造函数,显式调用父类的两个参数的构造函数public Student(String name, int age, String studentId) {super(name, age); // 调用父类的两个参数的构造函数System.out.println("调用了Student的两个参数的构造函数");this.studentId = studentId;}// Getter 和 Setter 方法public String getStudentId() {return studentId;}public void setStudentId(String studentId) {this.studentId = studentId;}
}// 测试类
public class Test {public static void main(String[] args) {// 测试Person类的构造函数Person p1 = new Person();Person p2 = new Person("Alice");Person p3 = new Person("Bob", 20);// 测试Student类的构造函数Student s1 = new Student();Student s2 = new Student("Charlie");Student s3 = new Student("David", 22, "S12345");}
}
输出结果

运行上述测试类 Testmain 方法,将输出以下结果:

调用了Person的无参构造函数
调用了Person的一个参数的构造函数
调用了Person的两个参数的构造函数
调用了Person的无参构造函数
调用了Student的无参构造函数
调用了Person的一个参数的构造函数
调用了Student的一个参数的构造函数
调用了Person的两个参数的构造函数
调用了Student的两个参数的构造函数
解释
  • 每当创建 PersonStudent 对象时,相应的构造函数都会被调用。
  • 子类的构造函数会隐式或显式地调用父类的构造函数。
  • 构造函数重载允许为不同的初始化场景提供不同的实现。

当然可以,以下是一些关于Java构造函数的额外例子,这些例子展示了构造函数在不同场景下的应用:

例子1:带有默认值的构造函数

public class Car {private String brand;private String model;private int year;// 带有默认值的构造函数public Car(String brand, String model, int year) {this.brand = brand;this.model = model;this.year = year;}// 带有默认值的构造函数,为year提供默认值public Car(String brand, String model) {this(brand, model, 2000); // 调用另一个构造函数}// Getter 和 Setter 方法// ...// toString 方法,用于打印Car对象的详细信息@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", model='" + model + '\'' +", year=" + year +'}';}public static void main(String[] args) {Car car1 = new Car("Toyota", "Camry", 2020);Car car2 = new Car("Honda", "Civic"); // 使用带有默认值的构造函数System.out.println(car1);System.out.println(car2);}
}

输出:

Car{brand='Toyota', model='Camry', year=2020}
Car{brand='Honda', model='Civic', year=2000}

例子2:使用构造代码块

public class Employee {private String name;private double salary;// 构造代码块,用于初始化所有Employee对象的共有属性{System.out.println("Employee构造代码块被调用");this.salary = 50000.0; // 设置默认薪水}// 无参构造函数public Employee() {System.out.println("Employee无参构造函数被调用");this.name = "Unknown"; // 设置默认姓名}// 带参数的构造函数public Employee(String name) {System.out.println("Employee带参数的构造函数被调用");this.name = name;}// Getter 和 Setter 方法// ...// toString 方法,用于打印Employee对象的详细信息@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", salary=" + salary +'}';}public static void main(String[] args) {Employee emp1 = new Employee();Employee emp2 = new Employee("John Doe");System.out.println(emp1);System.out.println(emp2);}
}

输出:

Employee构造代码块被调用
Employee无参构造函数被调用
Employee{name='Unknown', salary=50000.0}
Employee构造代码块被调用
Employee带参数的构造函数被调用
Employee{name='John Doe', salary=50000.0}

例子3:静态构造函数(注意:Java没有静态构造函数的概念,但可以通过静态代码块实现类似功能)

虽然Java没有静态构造函数,但可以使用静态代码块来初始化静态变量或执行类级别的初始化操作。

public class Bank {private static String bankName;// 静态代码块,用于初始化静态变量static {bankName = "National Bank";System.out.println("Bank静态代码块被调用");}// 构造函数public Bank() {System.out.println("Bank构造函数被调用");}// Getter 方法public static String getBankName() {return bankName;}public static void main(String[] args) {Bank bank1 = new Bank();Bank bank2 = new Bank();System.out.println("Bank Name: " + Bank.getBankName());}
}

输出:

Bank静态代码块被调用(只调用一次,当类被加载时)
Bank构造函数被调用
Bank构造函数被调用
Bank Name: National Bank

例子4:抽象类的构造函数

抽象类可以有构造函数,这些构造函数主要用于初始化抽象类的状态,并由子类在实例化时调用。

abstract class Shape {protected String color;// 抽象类的构造函数public Shape(String color) {this.color = color;System.out.println("Shape构造函数被调用,颜色设置为:" + color);}// 抽象方法,由子类实现public abstract double area();
}class Circle extends Shape {private double radius;// 子类的构造函数,调用父类的构造函数public Circle(String color, double radius) {super(color); // 调用父类的构造函数this.radius = radius;System.out.println("Circle构造函数被调用,半径设置为:" + radius);}// 实现父类的抽象方法@Overridepublic double area() {return Math.PI * radius * radius;}
}public class TestShapes {public static void main(String[] args) {Shape circle = new Circle("Red", 5.0);System.out.println("Circle Area: " + circle.area());}
}

输出:

Shape构造函数被调用,颜色设置为:Red
Circle构造函数被调用,半径设置为:5.0
Circle Area: 78.53981633974483

这些例子展示了Java构造函数在不同场景下的应用,包括带有默认值的构造函数、构造代码块、静态代码块(模拟静态构造函数)以及抽象类的构造函数。

以下是一个更加复杂的Java类设计示例,它展示了构造函数、继承、多态、以及抽象类和接口的综合应用。这个示例将模拟一个简单的图形编辑器,其中包含不同的图形对象(如圆形、矩形和三角形),每种图形都有自己的属性和行为。

首先,我们定义一个Shape抽象类,它包含所有图形对象的共有属性和方法:

abstract class Shape {protected String color;protected double width; // 对于某些图形,这可以是宽度;对于圆形,可以视为直径的参考protected double height; // 对于某些图形,这可以是高度;对于圆形,可以忽略// 抽象类的构造函数public Shape(String color, double width, double height) {this.color = color;this.width = width;this.height = height;System.out.println("Shape constructor called for " + getClass().getSimpleName() + " with color " + color);}// 抽象方法,计算面积public abstract double calculateArea();// 抽象方法,计算周长public abstract double calculatePerimeter();// 通用方法,设置颜色public void setColor(String color) {this.color = color;}// 通用方法,获取颜色public String getColor() {return color;}// 通用方法,打印图形信息public void printInfo() {System.out.println("Shape: " + getClass().getSimpleName() + ", Color: " + color + ", Area: " + calculateArea() + ", Perimeter: " + calculatePerimeter());}
}

接下来,我们定义三个具体的图形类:CircleRectangleTriangle,它们分别继承自Shape类并实现其抽象方法:

class Circle extends Shape {private double radius;// Circle的构造函数public Circle(String color, double diameter) {super(color, diameter, 0); // 对于圆形,我们只需要直径,高度设为0作为占位符this.radius = diameter / 2;System.out.println("Circle constructor called with diameter " + diameter);}// 重写calculateArea方法@Overridepublic double calculateArea() {return Math.PI * radius * radius;}// 重写calculatePerimeter方法@Overridepublic double calculatePerimeter() {return 2 * Math.PI * radius;}
}class Rectangle extends Shape {// Rectangle的构造函数public Rectangle(String color, double width, double height) {super(color, width, height);System.out.println("Rectangle constructor called with width " + width + " and height " + height);}// 重写calculateArea方法@Overridepublic double calculateArea() {return width * height;}// 重写calculatePerimeter方法@Overridepublic double calculatePerimeter() {return 2 * (width + height);}
}
class Triangle extends Shape {private double base;private double height;// Triangle的构造函数public Triangle(String color, double base, double height) {super(color, base, 0); // 对于三角形,我们只需要底和高,宽度设为底,高度设为高,但高度参数在Shape中作为占位符this.base = base;this.height = height;System.out.println("Triangle constructor called with base " + base + " and height " + height);}// 重写calculateArea方法@Overridepublic double calculateArea() {return 0.5 * base * height;}// 重写calculatePerimeter方法(这里简化处理,不计算具体周长,仅作为示例)@Overridepublic double calculatePerimeter() {// 注意:这里应该有一个更复杂的计算方式,但为了简化,我们返回一个固定值return -1; // 表示不计算周长}
}

最后,我们编写一个测试类来创建这些图形对象并打印它们的信息:

public class ShapeTest {public static void main(String[] args) {Shape circle = new Circle("Red", 10); // 直径为10的圆形Shape rectangle = new Rectangle("Blue", 5, 10); // 宽为5,高为10的矩形Shape triangle = new Triangle("Green", 6, 8); // 底为6,高为8的三角形// 打印图形信息circle.printInfo();rectangle.printInfo();triangle.printInfo(); // 注意:三角形的周长计算在这里被简化为返回-1}
}

输出将类似于:

Shape constructor called for Circle with color Red
Circle constructor called with diameter 10
Shape: Circle, Color: Red, Area: 78.53981633974483, Perimeter: 62.83185307179586
Shape constructor called for Rectangle with color Blue and height 10
Rectangle constructor called with width 5.0 and height 10.0
Shape: Rectangle, Color: Blue, Area: 50.0, Perimeter: 30.0
Shape constructor called for Triangle with color Green
Triangle constructor called with base 6.0 and height 8.0
Shape: Triangle, Color: Green, Area: 24.0, Perimeter: -1.0

这个示例展示了如何使用构造函数来初始化对象的状态,如何使用抽象类和接口来定义通用行为,以及如何通过继承和多态来实现具体行为。

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

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

相关文章

单体架构的 IM 系统设计

先直接抛出业务背景! 有一款游戏,日活跃量(DAU)在两千左右,虽然 DAU 不高,但这两千用户的忠诚度非常高,而且会持续为游戏充值;为了进一步提高用户体验,继续增强用户的忠…

设计模式之单列模式(7种单例模式案例,Effective Java 作者推荐枚举单例模式)

前言 在设计模式中按照不同的处理方式共包含三大类;创建型模式、结构型模式和行为模式,其中创建型模式目前已经介绍了其中的四个;工厂方法模式、抽象工厂模式、生成器模式和原型模式,除此之外还有最后一个单例模式。 单列模式介绍…

具有扩展卷积的DCNN

目的: 进行了一系列实验来证明,在没有任何全连接层的情况下,具有扩展卷积的 DCNN 的性能并不比广泛使用的具有包含收缩(无零填充)卷积层和多个全连接层的混合结构的深度神经网络差。 DCNN:Deep convoluti…

【linux】查看不同网络命名空间的端口

在部署harbor时,内部用的是数据库postgresql,端口默认是: 5432,一开始以为这个数据库docker容器是在本命名空间中,一直用ss -lnt查询系统的端口,找不到5432端口。但是harbor要能正常使用,所有怀疑harbor的容…

W5500-EVB-Pico2评估板介绍

目录 1 概述 2 板载资源 2.1 硬件规格 2.2 硬件规格 2.3 工作条件 3 参考资料 3.1 RP2350 数据手册 3.2 W5500 数据手册 3.3 原理图 原理图 & 物料清单 & Gerber 文件 3.3 尺寸图 (单位 : mm) 3.4 参考例程 认证 CE FCC AWS 资质 Microsoft Azure 认证…

2024MoonBit全球编程创新挑战赛参赛作品“飞翔的小鸟”技术开发指南

本文转载自 CSDN:https://blog.csdn.net/m0_61243965/article/details/143510089作者:言程序plus 实战开发基于moonbit和wasm4的飞翔的小鸟游戏 游戏中,玩家需要通过上下左右按键控制Bird,在不断移动的障碍pipe之间穿梭&#xf…

认证授权基础概念详解

目录 认证 (Authentication) 和授权 (Authorization)的区别是什么? RBAC 模型了解吗? 什么是 Cookie ? Cookie 的作用是什么? 如何在项目中使用 Cookie 呢? 如何在 Spring Boot 中创建和读取 Cookie 创建 Cookie Cookie 到期日期 安全…

彻底解决idea不识别java项目

需求背景 下载了一个java swing的项目,通过idea导入后,项目无法识别。打开java文件,也不会报错,也不编译。 无法识别效果图 可以看到左侧的菜单,项目是没有被识别。 打开java文件,可以看到没有识别,java的图标也没有出现。 解决方法 1、打开Project Structure 2、修改…

R6:LSTM实现糖尿病探索与预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、实验目的: 学习使用LSTM对糖尿病进行探索预测 二、实验环境: 语言环境:python 3.8编译器:Jupyter notebook…

笔试题11 -- 装箱问题(01背包)

装箱问题(01背包) 文章目录 装箱问题(01背包)一、原题复现二、思路剖析三、示例代码 题目链接:NOIP2001装箱问题 一、原题复现 题目描述 有一个箱子容量为V(正整数,0 ≤ V ≤ 20000)…

【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

测试-正交表与工具pairs的介绍使用(1)

目录 正交表 生成正交表 步骤 实操 注意事项 编写测试用例 根据正交表编写测试用例 补充遗漏的重要测试用例 正交表 关于长篇大论也不多介绍了,我们只需要知道正交法的⽬的是为了减少⽤例数⽬,⽤尽量少的⽤例覆盖输⼊的两两组合 正交表的构成&…

抗晃电马达保护器在工业厂房中的应用

安科瑞刘鸿鹏 摘要 随着工业自动化水平的提高,生产线上电动机作为关键设备的使用频率不断增加。然而,工厂生产环境中的电力波动,尤其是晃电现象,会对电动机的正常运转造成干扰,甚至导致设备停机和生产中断。抗晃电型…

linux之调度管理(2)-调度器 如何触发运行

一、调度器是如何在程序稳定运行的情况下进行进程调度的 1.1 系统定时器 因为我们主要讲解的是调度器,而会涉及到一些系统定时器的知识,这里我们简单讲解一下内核中定时器是如何组织,又是如何通过通过定时器实现了调度器的间隔调度。首先我们…

RHCE循环执行的例行性任务--crontab(周期性)

1.每分钟执行命令 2.每小时执行 3.每天凌晨3点半和12点半执行脚本 4.每隔6小时,相当于6,12,18,24点半执行脚本 5.30半点,8-18/2表示早上8点到下午18点之间每隔2小时执行脚本代表 6.每天晚上9点30重启nginx 7.每月1号和10号4点45执行脚本 8. 每周六和周日…

ETLCloud异常问题分析ai功能

在数据处理和集成的过程中,异常问题的发生往往会对业务运营造成显著影响。为了提高ETL(提取、转换、加载)流程的稳定性与效率,ETLCloud推出了智能异常问题分析AI功能。这一创新工具旨在实时监测数据流动中的潜在异常,自…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!

前言 程序员的终极追求是什么?当系统流量大增,用户体验却丝滑依旧?没错!然而,在大量文件传输、数据传递的场景中,传统的“数据搬运”却拖慢了性能。为了解决这一痛点,Linux 推出了 零拷贝 技术&…

密码学是如何保护数据传输的安全性?

密码学通过一系列算法和协议来保护数据传输的安全性。 一、加密技术 对称加密算法 原理:使用相同的密钥进行加密和解密。应用:在数据传输过程中,发送方和接收方共享一个密钥,数据在传输前被加密,接收方使用相同的密钥…

python怎么打开py文件

1、首先在资源管理器里复制一下py文件存放的路径,按下windows键+r,在运行里输入cmd,回车打开命令行: 2、在命令行里,先切换到py文件的路径下面,接着输入“python 文件名.py ”运行python文件&a…