4.自定义类Person,用无参构造器和有参构造器创建对象,实现方法addAge,同时在构造器中this关键字实现对属性和构造器的访问。
时间: 2024-10-24 16:15:49 浏览: 56
好的,我们可以创建一个名为`Person`的类,它包含一个无参构造器、一个带参数的构造器以及一个`addAge`方法。在这个类中,我们将利用`this`关键字来引用当前对象实例,并在构造器中初始化属性。
首先,我们定义一个无参构造器,它将允许用户直接创建一个新的Person对象:
```java
public class Person {
private int age;
// 无参构造器
public Person() {
this.age = 0;
}
// 然后我们添加有参构造器,用于设置初始年龄
public Person(int initialAge) {
this(age = initialAge); // 使用this调用无参构造器并更新age
}
// addAge方法
public void addAge(int increment) {
age += increment;
}
// 构造器内可以访问到的属性和构造器
// 这里不需要显式使用this,因为内部构造已经自动完成
}
```
在这个例子中,当我们通过`Person p = new Person(18);`这种方式创建对象时,如果传入了初始年龄,就会调用带参数的构造器。如果没有提供参数,则会默认调用无参构造器。`addAge`方法则用于增加这个人的年龄。
相关问题
自定义类Person,用无参构造器和有参构造器创建对象,实现方法addAge,同时在构造器中this关键字实现对属性和构造器的访问。
在Java中,我们可以自定义一个名为`Person`的类,它包含无参构造器、带参数的构造器以及一个用于增加年龄的方法。`this`关键字在这个场景下通常用来引用当前对象,以便于在构造函数内部操作。
首先,我们定义一个无参构造器,用于初始化对象的基本属性:
```java
public class Person {
private int age;
// 无参构造器
public Person() {
this.age = 0; // 默认年龄为0
}
// 有参构造器,接受年龄作为输入
public Person(int initialAge) {
this(age = initialAge); // 使用this关键字设置age
}
// 定义addAge方法,增加年龄
public void addAge(int years) {
age += years;
}
}
```
在上面的代码中,当我们使用无参构造器创建对象时,如果没有提供年龄,则默认年龄为0。而如果有参构造器则可以直接设置初始年龄。通过`this.age = initialAge`,我们在构造器内部更新了对象的`age`属性。
要实例化并使用这个类,可以这样做:
```java
// 创建一个无参构造的对象
Person person1 = new Person();
person1.addAge(5); // person1的年龄为5
// 创建一个有参构造的对象
Person person2 = new Person(20);
person2.addAge(3); // person2的年龄为23
```
(1)编写一个Person抽象类,要求含有姓名(name)年龄(age)两个私有属性以及吃饭(eat) 和睡觉(sleep)两个抽象方法,并写出带参构造方法 (2)创建学生(student)和工人(worker) 两个类,继承Person类,学生类多出了私有属性学号和学习方法(输出我爱学习),工人类多出了私有属性工号和工作方法(输出我爱工作), (3)在Test类中创建学生和工人类的实例对象,使用构造方法赋值,并输出所有属性和方法 (4) 创建LinkedList集合存5个学生对象,用迭代器和foreach循环,输出所有学生学号信息
(1)Person抽象类的代码如下:
```java
public abstract class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void eat();
public abstract void sleep();
}
```
(2)学生类和工人类的代码如下:
```java
public class Student extends Person {
private String studentId;
public Student(String name, int age, String studentId) {
super(name, age);
this.studentId = studentId;
}
public void study() {
System.out.println("我爱学习");
}
@Override
public void eat() {
System.out.println("学生吃饭");
}
@Override
public void sleep() {
System.out.println("学生睡觉");
}
}
public class Worker extends Person {
private String workerId;
public Worker(String name, int age, String workerId) {
super(name, age);
this.workerId = workerId;
}
public void work() {
System.out.println("我爱工作");
}
@Override
public void eat() {
System.out.println("工人吃饭");
}
@Override
public void sleep() {
System.out.println("工人睡觉");
}
}
```
(3)Test类的代码如下:
```java
import java.util.LinkedList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
// 创建学生和工人的实例对象
Student student = new Student("小明", 18, "001");
Worker worker = new Worker("张三", 30, "002");
// 输出所有属性和方法
System.out.println("学生的姓名:" + student.getName() + ",年龄:" + student.getAge() + ",学号:" + student.getStudentId());
student.eat();
student.sleep();
student.study();
System.out.println("工人的姓名:" + worker.getName() + ",年龄:" + worker.getAge() + ",工号:" + worker.getWorkerId());
worker.eat();
worker.sleep();
worker.work();
// 创建LinkedList集合存5个学生对象
LinkedList<Student> studentList = new LinkedList<>();
studentList.add(new Student("小红", 20, "003"));
studentList.add(new Student("小刚", 19, "004"));
studentList.add(new Student("小芳", 21, "005"));
studentList.add(new Student("小亮", 18, "006"));
studentList.add(new Student("小丽", 22, "007"));
// 用迭代器输出所有学生学号信息
System.out.println("使用迭代器输出所有学生学号信息:");
Iterator<Student> iterator = studentList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getStudentId());
}
// 用foreach循环输出所有学生学号信息
System.out.println("使用foreach循环输出所有学生学号信息:");
for (Student s : studentList) {
System.out.println(s.getStudentId());
}
}
}
```
输出结果如下:
```
学生的姓名:小明,年龄:18,学号:001
学生吃饭
学生睡觉
我爱学习
工人的姓名:张三,年龄:30,工号:002
工人吃饭
工人睡觉
我爱工作
使用迭代器输出所有学生学号信息:
003
004
005
006
007
使用foreach循环输出所有学生学号信息:
003
004
005
006
007
```
阅读全文