PTA Java程序设计
7-2 jmu-Java-03面向对象基础-02-构造方法与初始化块
懒人一键copy
思路分析
1.定义一个Person类
属性:String name
, boolean gender
, int age
, int id
,static int num
,所有的变量必须为私有(private
)。(在编写初始化块中需要添加static
的变量用于赋值给id
)
无参构造函数:Person()
, 功能:打印This is constructor
,将name,age,gender,id按照name,age,gender,id格式输出。
有参构造函数:Person(name, gender, age)
,功能:给属性赋值。
建议:使用快捷生成toString方法
分析:
- 定义Person的类,创建
String name, boolean gender, int age, int id
并且定义为私有属性(privat)
- 使用快捷生成创建无参构造器
Person()
,输出格式- 生成有参构造器和**toString()**方法
ps:(生成的toStirng()方法有一对单引号,记得删除哦)
private String name;
private int age;
private boolean gender;
private int id;
private static int num;
//定义一个静态变量
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;
}
2.定义类的初始化块
为Person类加入初始化块,在初始化块中对id
属性赋值,并且要保证每次的值比上次创建的对象的值+1。然后在下一行打印This is initialization block, id is ...
其中...
是id
的值。
提示:可为Person
类定义一个static
属性来记录所创建的对象个数。
分析:
- 创建一个初始化块,并在Person类中定义一个
static
的属性用来赋值给id
,并且这个属性要自增,在下一行打印"This is initialization block, id is "+id
//初始化块
{
id = num;
//对id属性赋值
num++;
System.out.println("This is initialization block, id is "+id);
}
3.编写静态初始化块
打印This is static initialization block
分析:
- 定义一个静态初始化块,然后输出
static {
System.out.println("This is static initialization block");
}
4.编写main方法
- 首先输入
n
,代表要创建的对象数量。 - 然后从控制台分别读取n行的name age gender,并调用有参构造函数Person(name, age, gender)新建对象 。
- 将创建好的n个对象逆序输出(即输出toString()方法)。
- 使用无参构造函数新建一个Person对象,然后直接打印该对象。
分析:
- 在main方法中使用
Scanner
输入n,并且数组的长度为n (代表有几个对象存入)- 遍历数组,在遍历的过程中创建对象,并将创建的对象逆序输出 (使用for循环倒序输出)
- 创建一个
Person
对象,直接打印该对象的toString()
方法
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Person[] s = new Person[n];
//创建数组长度为n
for (int i = 0; i < n; i++) {
String a = sc.next();
int b = sc.nextInt();
boolean c=sc.nextBoolean();
s[i] = new Person(a,b,c);
//将对象赋值给数组s的索引为0
}
//i=3
//但是索引只有到2,故-1
for (int i = n-1; i >=0; i--) {
System.out.println(s[i].toString());
//打印出数组s的索引为i(调用对象)的toString方法
}
Person person = new Person();
System.out.println(person.toString());
5.思考
初始化类与对象有几种方法,构造函数、初始化块、静态初始化块。这三种方法执行的先后顺序是什么?各执行几次。
分析:
- 构造代码块用于初始化对象,每创建一个对象就会被执行一次;
- 静态代码块用于初始化类,随着类的加载而执行,不管创建几个对象,都只执行一次。
- 静态代码块优先于构造代码块的执行
- 都定义在类中,一个带static关键字,一个不带static 构造函数
- 非静态初始化块、静态代码块都是用于初始化,三者的执行顺序依次是:
静态代码块>构造代码块>构造函数。
懒人一键copy
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Person[] s = new Person[n];
for (int i = 0; i < n; i++) {
String a = sc.next();
int b = sc.nextInt();
boolean c=sc.nextBoolean();
s[i] = new Person(a,b,c);
}
for (int i = n-1; i >=0; i--) {
System.out.println(s[i].toString());
}
Person person = new Person();
System.out.println(person.toString());
}
}
class Person{
private String name;
private int age,id;
private boolean gender;
private static int num;
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;
}
@Override
public String toString() {
return "Person [" +
"name=" + name +
", age=" + age +
", gender=" + gender +
", id=" + id +
']';
}
{
id = num;
num++;
System.out.println("This is initialization block, id is "+id);
}
static {
System.out.println("This is static initialization block");
}
}