午后狂睡 发表于 2022-1-22 15:24:26

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;
    }
}

求大佬解答一下,划红线的代码功能是什么。

1449620085 发表于 2022-1-22 15:47:41

{:10_256:}{:10_256:}

1449620085 发表于 2022-1-22 15:48:15

{:10_254:}{:10_254:}

1449620085 发表于 2022-1-22 15:48:55

{:10_245:}{:10_245:}

小伤口 发表于 2022-1-22 16:03:36


{
      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( )就是访问构造方法,没有参数就访问无参构造
如果有参数就是调用指定的有参构造方法。
也是有参数个数来决定那个构造方法

小伤口 发表于 2022-1-22 16:04:59

{:9_236:}

小伤口 发表于 2022-1-22 16:05:34

{:7_131:}

伽羅~ 发表于 2022-1-22 16:44:29

{:10_279:}

翼是孤独 发表于 2022-1-22 16:51:09

static{...} 是静态代码块,位于类中方法外,对某个类初始化的时候执行,且只会执行一次
       什么时候类会初始化?
       当你首次创建类对象,或者访问类的静态属性时(这个时候不创建类的对象也会初始化)时
方法外的{} 是构造代码块,位于类中方法外,没static关键字,每次调用构造方法前 会 先执行构造代码块中的内容。
       也就是说,无论你创建对象用的哪个构造方法,都会先执行构造代码块。(事实上构造代码块就是为了节省代码,它的内容是取自 各种构造方法中 相同的那部分代码)
局部代码块:方法中的{},有生命周期的限制,方法运行结束就会释放,目的就是为了提高内存利用率。这部分想了解去看JVM GC回收机制

简而言之,静态代码块 就是 初次类加载的时候会执行一次,也只需要执行一次。构造代码块就是调用构造方法创建类实例之前执行。

方法重载的话就是 方法名相同,参数不同的方法,你调用的时候 会依据 你传入的参数类型判断你调用的是哪个方法。

这部分理解清楚建议读一下Thinking in Java
页: [1]
查看完整版本: Java对象与类的代码问题