你好,我是林森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)。
注意:属性顺序请严格按照上述顺序依次出现。
要求:
- 编写无参构造函数 :打印
This is constructor。将 name,age,gender,id 按照name,age,gender,id格式输出 - 编写有参构造函数:依次对 name,age,gender 赋值。
- 覆盖 toString 函数 :按照格式:
类名 [name=, age=, gender=, id=]输出。 - 对每个属性生成 setter/getter 方法
- 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()读布尔值
逆序遍历:i从n-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();
}
}
六、程序执行流程复盘(重要)
- 程序启动,读 n=3
- 创建长度为 3 的 Person 数组
- 第一次循环 i=0:读 a 11 false → 创建对象存入 people 0
- 第二次循环 i=1:读 b 12 true → 创建对象存入 people 1
- 第三次循环 i=2:读 c 10 false → 创建对象存入 people 2
- 逆序遍历:i=2→打印 c 的信息 → i=1→打印 b 的信息 → i=0→打印 a 的信息
- 执行
new Person():调用无参构造 → 先打印 "This is constructor" → 再打印 null,0,false,0 - 打印无参对象:自动调用 toString → 输出 Person name=null, ...
七、总结
封装规范:private 私有化属性,getter/setter 方法
构造方法:无参、有参构造的定义、执行时机、作用
toString 重写:自定义对象打印格式,注解使用
对象数组:创建、存储、遍历、逆序输出
Scanner 输入:不同类型数据的读取,对应第一章输入知识点
++诸位共勉,无限学习!++
