【日耕一题】2. 面向对象 Java 基础:构造方法与 toString

你好,我是林森lsjs

欢迎来到日耕一题,跟着我,吃透这道题 这道题是 Java 面向对象入门必考核心题,覆盖封装、构造方法、toString 重写等考点

目录

一、原题

输入样例

输出样例

二、前置知识点

[1. 封装与 private 关键字](#1. 封装与 private 关键字)

[2. 构造方法:无参构造 vs 有参构造](#2. 构造方法:无参构造 vs 有参构造)

[3. toString 方法到底是干嘛的?](#3. toString 方法到底是干嘛的?)

[4. 对象数组逆序输出](#4. 对象数组逆序输出)

三、整体解题思路

四、编写代码

[1. 第一步:定义私有属性(按题目顺序)](#1. 第一步:定义私有属性(按题目顺序))

[2. 第二步:编写无参构造方法](#2. 第二步:编写无参构造方法)

[3. 第三步:编写有参构造方法](#3. 第三步:编写有参构造方法)

[4. 第四步:生成所有属性的 getter/setter](#4. 第四步:生成所有属性的 getter/setter)

[5. 第五步:重写 toString 方法(格式严格匹配)](#5. 第五步:重写 toString 方法(格式严格匹配))

[6. 第六步:主方法实现](#6. 第六步:主方法实现)

五、完整代码

六、程序执行流程复盘(重要)

七、总结


一、原题

7-2 jmu-Java-03 面向对象基础 - 01 - 构造方法与 toString

定义一个有关人的 Person 类,内含属性:String name、int age、boolean gender、int id所有的变量必须为私有 (private)。

注意:属性顺序请严格按照上述顺序依次出现

要求:

  1. 编写无参构造函数 :打印This is constructor。将 name,age,gender,id 按照name,age,gender,id格式输出
  2. 编写有参构造函数:依次对 name,age,gender 赋值。
  3. 覆盖 toString 函数 :按照格式:类名 [name=, age=, gender=, id=]输出。
  4. 对每个属性生成 setter/getter 方法
  5. main 方法中首先从屏幕读取 n,代表要创建的对象个数。然后输入 n 行name age gender,调用有参构造新建对象。然后将刚才创建的所有对象逆序输出。接下来使用无参构造新建一个 Person 对象,并直接打印该对象。

输入样例

复制代码
3
a 11 false
b 12 true
c 10 false

输出样例

复制代码
Person [name=c, age=10, gender=false, id=0]
Person [name=b, age=12, gender=true, id=0]
Person [name=a, age=11, gender=false, id=0]
This is constructor
null,0,false,0
Person [name=null, age=0, gender=false, id=0]

二、前置知识点

1. 封装与 private 关键字

所有属性必须加private,私有化,外部不能直接访问

对外提供getter/setter方法读写属性,这是 Java 强制规范

2. 构造方法:无参构造 vs 有参构造

那有人就问了:构造方法到底是干嘛的?和普通方法有啥区别?

作用:创建对象的时候自动执行,专门给属性初始化赋值

特点:方法名必须和类名完全一样,没有返回值类型,连 void 都不能写

分类:

① 无参构造:没有参数,创建空对象的时候调用

② 有参构造:带参数,创建对象的时候直接给属性赋值

3. toString 方法到底是干嘛的?

那有人就问了:我直接打印对象,为什么会输出一堆乱码?

默认的 toString:输出类名@哈希值,完全看不懂

重写 toString:自定义打印对象的格式,直接打印对象就会自动调用这个方法

本题要求:严格按照Person [name=xxx, age=xxx, ...]格式重写

4. 对象数组逆序输出

和我们日耕一题的第一题图书类的对象数组逻辑一样:

先正序存对象到数组

输出的时候从最后一个下标往前遍历,就是逆序

比如数组长度 3,下标 0、1、2,输出顺序 2→1→0 就是逆序

三、整体解题思路

先写 Person 类骨架,按题目顺序写 4 个私有属性

先写无参构造,再写有参构造

给每个属性生成 getter/setter

重写 toString,严格匹配格式

主方法:

① 用 Scanner 读 n(对应我们第一章输入知识点)

② 循环 n 次,读每行的 name、age、gender,创建对象存数组

③ 逆序遍历数组,打印每个对象④ new 无参 Person 对象,直接打印


四、编写代码

1. 第一步:定义私有属性(按题目顺序)

java 复制代码
public class Person {
    // 【重点】属性顺序严格按照题目要求:name→age→gender→id,全部私有
    private String name;    // 姓名
    private int age;        // 年龄
    private boolean gender; // 性别
    private int id;         // 编号,默认值0
}

顺序不能乱

2. 第二步:编写无参构造方法

java 复制代码
// 无参构造方法:方法名必须和类名Person完全一致,无返回值
public Person() {
    // 1. 先打印固定字符串
    System.out.println("This is constructor");
    // 2. 输出四个属性的默认值:String默认null,int默认0,boolean默认false
    System.out.println(name + "," + age + "," + gender + "," + id);
}

无参构造没有参数,new Person()的时候自动调用

成员变量默认值:引用类型(String)默认 null,int 默认 0,boolean 默认 false

正好对应样例输出的null,0,false,0


3. 第三步:编写有参构造方法

java 复制代码
// 有参构造方法:参数顺序和属性对应,只给前三个赋值,id默认0
public Person(String name, int age, boolean gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
    // id不赋值,默认就是0,对应样例里所有id都是0
}

this.属性:区分成员变量和参数,和我们第五章讲的 this 用法完全一致

题目只要求给 name、age、gender 赋值,id 不用管,默认 0 就行


4. 第四步:生成所有属性的 getter/setter

java 复制代码
// name的get/set
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

// age的get/set
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

// gender的get/set
public boolean isGender() {
    return gender;
}
public void setGender(boolean gender) {
    this.gender = gender;
}

// id的get/set
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}

boolean 类型的 getter 方法默认是isXxx,不是getXxx

这是 Java 规范,IDE 自动生成就是这个格式,完全符合题目要求。


5. 第五步:重写 toString 方法(格式严格匹配)

java 复制代码
// 重写toString方法,格式完全匹配题目要求
@Override
public String toString() {
    return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", id=" + id + "]";
}

必须加@Override注解,标识这是重写的方法

格式一个符号都不能错:空格、逗号、中括号、等号,完全和样例一致

直接打印对象的时候,会自动调用这个方法,输出我们定义的格式


6. 第六步:主方法实现

java 复制代码
public static void main(String[] args) {
    // 1. 创建输入工具,对应我们第一章输入三板斧
    Scanner sc = new Scanner(System.in);
    
    // 2. 读取n:对象个数
    int n = sc.nextInt();
    
    // 3. 创建Person对象数组,长度n
    Person[] people = new Person[n];
    
    // 4. 循环读n行数据,创建对象存入数组
    for (int i = 0; i < n; i++) {
        String name = sc.next();
        int age = sc.nextInt();
        boolean gender = sc.nextBoolean();
        // 调用有参构造创建对象,存入数组
        people[i] = new Person(name, age, gender);
    }
    
    // 5. 【重点】逆序输出:从最后一个下标往前遍历
    for (int i = n - 1; i >= 0; i--) {
        // 直接打印对象,自动调用toString方法
        System.out.println(people[i]);
    }
    
    // 6. 调用无参构造创建对象,直接打印
    Person p = new Person();
    System.out.println(p);
    
    sc.close(); // 关闭输入流,对应第一章讲的sc.close()
}

输入部分完全用我们第一章讲的 Scanner 用法,next()读字符串、nextInt()读整数、nextBoolean()读布尔值

逆序遍历:in-1开始,到 0 结束,就是倒着输出,对应样例先输出 c、再 b、再 a

直接打印对象:自动调用我们重写的 toString 方法,不用手动调用

五、完整代码

java 复制代码
import java.util.Scanner;

public class Person {
    // 私有属性,严格按顺序
    private String name;
    private int age;
    private boolean gender;
    private int id;

    // 无参构造
    public Person() {
        System.out.println("This is constructor");
        System.out.println(name + "," + age + "," + gender + "," + id);
    }

    // 有参构造
    public Person(String name, int age, boolean gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // 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 boolean isGender() {
        return gender;
    }
    public void setGender(boolean gender) {
        this.gender = gender;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    // 重写toString
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", id=" + id + "]";
    }

    // 主方法
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Person[] people = new Person[n];

        for (int i = 0; i < n; i++) {
            String name = sc.next();
            int age = sc.nextInt();
            boolean gender = sc.nextBoolean();
            people[i] = new Person(name, age, gender);
        }

        // 逆序输出
        for (int i = n - 1; i >= 0; i--) {
            System.out.println(people[i]);
        }

        // 无参构造对象
        Person p = new Person();
        System.out.println(p);

        sc.close();
    }
}

六、程序执行流程复盘(重要)

  1. 程序启动,读 n=3
  2. 创建长度为 3 的 Person 数组
  3. 第一次循环 i=0:读 a 11 false → 创建对象存入 people 0
  4. 第二次循环 i=1:读 b 12 true → 创建对象存入 people 1
  5. 第三次循环 i=2:读 c 10 false → 创建对象存入 people 2
  6. 逆序遍历:i=2→打印 c 的信息 → i=1→打印 b 的信息 → i=0→打印 a 的信息
  7. 执行new Person():调用无参构造 → 先打印 "This is constructor" → 再打印 null,0,false,0
  8. 打印无参对象:自动调用 toString → 输出 Person name=null, ...

七、总结

封装规范:private 私有化属性,getter/setter 方法

构造方法:无参、有参构造的定义、执行时机、作用

toString 重写:自定义对象打印格式,注解使用

对象数组:创建、存储、遍历、逆序输出

Scanner 输入:不同类型数据的读取,对应第一章输入知识点

++诸位共勉,无限学习!++

相关推荐
广_1 小时前
用AI写一个Python实时硬件监控与日志可视化界面
开发语言·人工智能·python
学代码的真由酱1 小时前
【自用】测开面试问题-Java
java·面试·职场和发展
过期动态1 小时前
【LeetCode 热题 100】三数之和
java·数据结构·算法·leetcode·职场和发展·排序算法
AI算法沐枫1 小时前
基于YOLO26深度学习的【果园荔枝检测与计数】系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
开发语言·人工智能·python·深度学习·qt·学习·机器学习
希望永不加班1 小时前
SpringBoot 服务注册与发现:Nacos/Consul/Eureka
java·spring boot·eureka·consul·java-consul
仙俊红2 小时前
spring有多个对象时如何注入
java·后端·spring
专注VB编程开发20年2 小时前
B4A (Basic4Android) Process_Globals(应用全局)和 Globals(类中公用变量)
java·开发语言
小a杰.2 小时前
PTO ISA 指令架构 - PTO虚拟指令集架构解析
java·开发语言·架构
Java爱好狂.2 小时前
Redis高级笔记:深入浅出Java面试高频考点!
java·数据库·redis·后端·java面试·java程序员·java八股文