鱼C论坛

 找回密码
 立即注册
查看: 2526|回复: 8

[已解决]Java对象与类的代码问题

[复制链接]
发表于 2022-1-22 15:24:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
package New;

import java.util.Random;

public class Constructor {
    public static void main(String[] args) {
        var staff = new Employee[3];

        //用三个employee对象填充staff数组
        staff[0] = new Employee("whup", 1000);
        staff[1] = new Employee("wly", 2000);
        staff[2] = 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;
    }
}

求大佬解答一下,划红线的代码功能是什么。
最佳答案
2022-1-22 16:03:36
{
        id = nextId;
        nextId++;
    }
这个是非静态代码块
可以为实例变量(非静态的属性)初始化
每次创建对象的时候,都会执行一次,
 public Employee(String n, double s) {
        name = n;
        salary = s;
    }
这个注释也写了是构造函数,不过一般叫构造方法吧,
构造方法就实例化对象用的也就是
staff[0] = new Employee("whup", 1000);
        staff[1] = new Employee("wly", 2000);
        staff[2] = new Employee("why", 3000);
在执行以上代码时,就是调用的构造方法,根据你的参数来决定调用那个构造方法
this("Employee" + nextId, s);
this( )就是访问构造方法,没有参数就访问无参构造
如果有参数就是调用指定的有参构造方法。
也是有参数个数来决定那个构造方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 15:47:41 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 15:48:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 15:48:55 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 16:03:36 | 显示全部楼层    本楼为最佳答案   
{
        id = nextId;
        nextId++;
    }
这个是非静态代码块
可以为实例变量(非静态的属性)初始化
每次创建对象的时候,都会执行一次,
 public Employee(String n, double s) {
        name = n;
        salary = s;
    }
这个注释也写了是构造函数,不过一般叫构造方法吧,
构造方法就实例化对象用的也就是
staff[0] = new Employee("whup", 1000);
        staff[1] = new Employee("wly", 2000);
        staff[2] = new Employee("why", 3000);
在执行以上代码时,就是调用的构造方法,根据你的参数来决定调用那个构造方法
this("Employee" + nextId, s);
this( )就是访问构造方法,没有参数就访问无参构造
如果有参数就是调用指定的有参构造方法。
也是有参数个数来决定那个构造方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-22 16:04:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 16:05:34 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 16:44:29 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

这部分理解清楚建议读一下Thinking in Java
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-3 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表