Java对象与类的代码问题
package New;import java.util.Random;
public class Constructor {
public static void main(String[] args) {
var staff = new Employee;
//用三个employee对象填充staff数组
staff = new Employee("whup", 1000);
staff = new Employee("wly", 2000);
staff = new Employee("why", 3000);
//打印所有员工对象的信息
for (Employee e : staff)
System.out.println("name= " + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary());
}
}
class Employee {
private static int nextId;
private int id;
private String name = "";
private double salary;
//静态初始化块
static {
var generator = new Random();
nextId = generator.nextInt();
}
//对象初始化块
{
id = nextId;
nextId++;
}
//三个重载构造函数
public Employee(String n, double s) {
name = n;
salary = s;
}
//调用employee (string,double)构造函数
public Employee(double s) {
this("Employee" + nextId, s);
}
//默认构造函数
public Employee() {
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public int getId() {
return id;
}
}
求大佬解答一下,划红线的代码功能是什么。 {:10_256:}{:10_256:} {:10_254:}{:10_254:} {:10_245:}{:10_245:}
{
id = nextId;
nextId++;
}
这个是非静态代码块
可以为实例变量(非静态的属性)初始化
每次创建对象的时候,都会执行一次,
public Employee(String n, double s) {
name = n;
salary = s;
}
这个注释也写了是构造函数,不过一般叫构造方法吧,
构造方法就实例化对象用的也就是
staff = new Employee("whup", 1000);
staff = new Employee("wly", 2000);
staff = new Employee("why", 3000);
在执行以上代码时,就是调用的构造方法,根据你的参数来决定调用那个构造方法
this("Employee" + nextId, s);
this( )就是访问构造方法,没有参数就访问无参构造
如果有参数就是调用指定的有参构造方法。
也是有参数个数来决定那个构造方法 {:9_236:} {:7_131:} {:10_279:} static{...} 是静态代码块,位于类中方法外,对某个类初始化的时候执行,且只会执行一次
什么时候类会初始化?
当你首次创建类对象,或者访问类的静态属性时(这个时候不创建类的对象也会初始化)时
方法外的{} 是构造代码块,位于类中方法外,没static关键字,每次调用构造方法前 会 先执行构造代码块中的内容。
也就是说,无论你创建对象用的哪个构造方法,都会先执行构造代码块。(事实上构造代码块就是为了节省代码,它的内容是取自 各种构造方法中 相同的那部分代码)
局部代码块:方法中的{},有生命周期的限制,方法运行结束就会释放,目的就是为了提高内存利用率。这部分想了解去看JVM GC回收机制
简而言之,静态代码块 就是 初次类加载的时候会执行一次,也只需要执行一次。构造代码块就是调用构造方法创建类实例之前执行。
方法重载的话就是 方法名相同,参数不同的方法,你调用的时候 会依据 你传入的参数类型判断你调用的是哪个方法。
这部分理解清楚建议读一下Thinking in Java
页:
[1]