Java 超详细讲解对象的构造及初始化

首先需要明确的是,对象的构造和初始化是面向对象编程中非常重要的概念,它影响着对象的生命周期和对象各个属性的默认值。

什么是构造函数

Java中,每个类都有一个构造函数,它是一个特殊的方法,用于实例化对象时被调用,构造函数通常用于初始化对象的属性,并确保对象在被实例化后能够正常使用。

在Java中,构造函数的名字与类名相同,没有返回值,可以像方法一样拥有参数列表。例如:

public class Person {
    private String name;
    private int age;

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

在这个例子中,Person类有一个构造函数,它有两个参数:name和age。构造函数用于初始化类的属性值,this关键字用于引用对象本身,可以在构造函数中使用它来访问类的成员变量。

构造函数的调用

当创建一个对象时,Java VM会自动为该对象分配内存,并调用类的构造函数初始化该对象的各个属性。例如:

Person p1 = new Person("张三", 21);

在这个例子中,我们创建了一个Person类的对象p1,并通过构造函数将name属性设置为"张三",并将age属性设置为21。

与方法不同,构造函数不可以被直接调用,而只能通过创建对象的方式来调用。

默认构造函数

默认构造函数是指没有参数的构造函数,如果一个类没有使用任何构造函数,Java编译器会自动生成一个默认构造函数,这个构造函数的行为与没有参数的构造函数类似,它会将对象的属性设置为默认值。

例如,当使用下面的代码创建一个Person对象时:

Person p2 = new Person();

由于Person类没有显式定义任何构造函数,Java编译器会自动为Person类生成一个默认构造函数,此时p2的属性值都是默认值。

构造函数的重载

Java中允许有多个构造函数,只要它们的参数列表不同,就可以实现构造函数的重载。例如,我们可以为Person类提供另一个具有单个参数的构造函数来初始化name属性:

public class Person {
    private String name;
    private int age;

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

    public Person(String name) {
        this.name = name;
        this.age = 0;
    }
}

在这个例子中,Person类提供了两个构造函数,分别具有不同的参数列表。我们可以使用下面的代码调用其中的一个构造函数:

Person p3 = new Person("李四", 18);
Person p4 = new Person("王五");

在这个例子中,我们分别创建了两个Person对象:p3和p4。p3使用了有两个参数的构造函数,而p4使用了仅有一个参数的构造函数。

对象初始化块

除了构造函数外,Java还允许在类中使用初始化块来初始化类的静态或实例变量。初始化块会在对象被创建时执行,并按照定义的顺序依次执行。

一个类可以拥有多个初始化块,可以在一个初始化块中进行复杂的初始化操作,例如使用循环和条件语句对变量进行赋值。

下面是一个拥有多个实例初始化块的例子:

public class Test {
    private int x;
    private int y;

    {
        System.out.println("第一个实例初始化块运行");
        x = 10;
    }

    {
        System.out.println("第二个实例初始化块运行");
        y = 20;
    }

    public Test() {
        System.out.println("构造函数运行");
    }

    public static void main(String[] args) {
        Test t = new Test();
    }
}

在这个例子中,我们定义了两个实例初始化块来初始化x和y变量。运行这个程序会得到以下输出:

第一个实例初始化块运行
第二个实例初始化块运行
构造函数运行

注意,在创建对象的过程中,x和y的初始化顺序是先执行第一个初始化块,然后执行第二个初始化块,最后执行构造函数。

示例说明

示例一

我们有一个圆形类:

public class Circle {
    private double radius; //半径
    private double area; //面积

    public Circle(double radius) { //构造函数,初始化半径
        this.radius = radius;
        this.area = Math.PI * radius * radius;
    }

    public void setRadius(double radius) { //设置圆的半径,并重新计算面积
        this.radius = radius;
        this.area = Math.PI * radius * radius;
    }

    public double getRadius() {
        return radius;
    }

    public double getArea() {
        return area;
    }
}

在这个例子中,我们定义了一个Circle类,它有一个构造函数,用于初始化半径,并计算圆的面积。注意,这里使用了Math类中的PI常量来计算圆面积。

现在,我们可以使用以下代码来创建若干个Circle对象:

Circle c1 = new Circle(1.0);
Circle c2 = new Circle(2.0);
Circle c3 = new Circle(3.0);

System.out.println("c1: " + c1.getRadius() + ", " + c1.getArea()); //输出:c1: 1.0, 3.141592653589793
System.out.println("c2: " + c2.getRadius() + ", " + c2.getArea()); //输出:c2: 2.0, 12.566370614359172
System.out.println("c3: " + c3.getRadius() + ", " + c3.getArea()); //输出:c3: 3.0, 28.274333882308138

在这个例子中,我们分别创建了三个Circle对象:c1、c2和c3,它们的半径分别为1、2和3,面积分别为3.1415、12.5663和28.2743。

示例二

我们有一个学生类:

public class Student {
    private static int count = 0; //统计学生人数
    private String name; //学生姓名
    private int age; //年龄
    private String major; //专业

    {
        count++; //每次创建对象时,学生人数增加1
    }

    public Student(String name, int age, String major) { //构造函数,初始化姓名、年龄和专业
        this.name = name;
        this.age = age;
        this.major = major;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getMajor() {
        return major;
    }

    public static int getCount() { //获取学生人数
        return count;
    }
}

在这个例子中,我们定义了一个Student类,它有一个构造函数,用于初始化姓名、年龄和专业。此外,我们使用了一个实例初始化块来统计学生人数。

现在,我们可以使用以下代码来创建若干个Student对象:

Student s1 = new Student("张三", 18, "计算机科学");
Student s2 = new Student("李四", 20, "电子工程");
Student s3 = new Student("王五", 21, "机械制造");

System.out.println("学生总人数:" + Student.getCount()); //输出:学生总人数:3

在这个例子中,我们分别创建了三个Student对象:s1、s2和s3,每次创建对象时,学生人数都会增加1。

最后,我们使用静态方法getCount()来获取学生总人数,并输出在控制台上。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 超详细讲解对象的构造及初始化 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java 方法递归的思路详解

    针对“Java 方法递归的思路详解”,我将针对以下几个方面进行详细讲解: 什么是方法递归? 方法递归的基本思路 方法递归的优缺点 方法递归的应用场景 工程中递归的运用示例 什么是方法递归? 方法递归是指在一个方法内部调用自身的行为,也就是说,一个方法通过调用自己来完成某种功能或者解决某个问题。 方法递归的基本思路 方法递归的基本思路可以概括为以下几个步骤: …

    Java 2023年5月19日
    00
  • 全面分析Java方法的使用与递归

    下面我来详细讲解”全面分析Java方法的使用与递归”的完整攻略。 一、基础知识 在Java中,方法是一段有名字和参数的代码块,通过方法可以将代码结构化并将其组织成可重用的模块。方法的核心作用是实现代码的复用和结构化,同时也可以通过参数定制方法的行为。 Java方法的定义格式如下: 修饰符 返回类型 方法名(参数列表) { // 方法体 } 其中,修饰符表示方…

    Java 2023年5月26日
    00
  • Java中的AssertionError是什么?

    AssertionError是Java标准库中的一个类,它继承自Error,被用于表示一个断言失败的情况。当条件表达式为false时,程序会抛出AssertionError异常,表达式的结果将由assert语句检查。assert语句通常用于编程中的测试和调试阶段,旨在确保程序的正确性和可靠性。 Assertion语法和示例说明 以下是在Java语言中使用As…

    Java 2023年4月27日
    00
  • spring boot项目打包成war在tomcat运行的全步骤

    下面是详细的步骤。 1.创建Spring Boot项目 首先,需要使用Spring Initializr创建一个Spring Boot项目。这里我们以创建一个简单的Spring Boot RESTful应用为例。 可以使用如下命令创建: curl https://start.spring.io/starter.zip -o myproject.zip unz…

    Java 2023年5月19日
    00
  • Java8中 LocalDate和java.sql.Date的相互转换操作

    Java 8中提供了新的日期时间API,其中非常重要的一部分是LocalDate类。在某些情况下需要将LocalDate转换为java.sql.Date,或者将java.sql.Date转换为LocalDate。接下来,我们来详细讲解Java 8中LocalDate和java.sql.Date的相互转换操作。 1. 将LocalDate转换为java.sql…

    Java 2023年6月1日
    00
  • Midjourney 提示词工具(10 个国内外最好最推荐的)

    Midjourney,是一个革命性的基于人工智能的艺术生成器,可以从被称为提示的简单文本描述中生成令人惊叹的图像。Midjourney已经迅速成为艺术家、设计师和营销人员的首选工具(包括像我这样根本不会设计任何东西的无能之辈)。 为了帮助你开始使用这个强大的工具,我们汇编了一份15个资源的清单,可以帮助你为你的下一个项目制作更好的提示语……或者让我们…

    Java 2023年4月22日
    00
  • Java实现小程序简单五子棋

    下面是Java实现小程序简单五子棋的完整攻略: 简介 五子棋是一种双人对弈的纯策略型棋类游戏,起源于中国古代,俗称”五子连珠”、”连五”等。本文将介绍如何利用Java实现一个简单的五子棋游戏。 步骤 1.创建项目 在Eclipse等开发工具中创建Java项目,选择Swing界面库,创建主类和GUI类。 2.设计界面 利用Swing实现GUI界面,包括棋盘、棋…

    Java 2023年5月30日
    00
  • log4j如何根据变量动态生成文件名

    log4j是一个Java日志框架,在Java web开发中非常常用。它可以为我们提供完善的日志记录、使用方便、配置简单。在log4j中,使用动态文件名可以使日志文件名根据指定的规则动态地生成,可以方便地管理和查找日志文件。 下面是实现log4j动态文件名的完整攻略。 配置log4j.properties文件 在log4j.properties文件中配置文件名…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部