• 零基础学Java(14)对象构造


    对象构造

    之前学习了编写简单的构造器,可以定义对象的初始状态。但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制。
     

    重载

    有些类有多个构造器。例如,可以如下构造一个空的StringBuilder对象:

    highlighter- Java
    var messages = new StringBuilder();

    或者,可以指定一个初始字符串:

    highlighter- Java
    var todoList = new StringBuilder("To do:\n");

    这种功能叫做重载。如果多个方法有相同的名字、不同的参数,便出现了重载。编译器必须挑选出具体调用哪个方法。它用各个方法首部中的参数类型与特定方法调用中所使用的的值类型进行匹配,来选出正确的方法。如果编译器找不到匹配的参数,就会产生编译时错误,因为根本不存在匹配,或者没有一个比其他的更好(这个查找匹配的过程被称为重载解析)
     

    默认字段初始化

    如果在构造器中没有显式地为字段设置初始值,那么就会被自动地赋为默认值:数值为0,布尔值为false,对象引用为null
     

    静态初始化块

    如果类的静态字段需要很复杂的初始化代码,那么可以使用静态的初始化块。
    将代码放在一个块中,并标记关键字static。下面给出一个示例。其功能是将员工ID的起始值赋予一个小于1000的随机整数

    highlighter- Java
    // 静态初始化块
    static {
        var generator = new Random();
        nextId = generator.nextInt(1000);
    }

    在类第一次加载的时候,将会进行静态字段的初始化。与实例字段一样,除非将静态字段显式地设置成其他值,否则默认的初始值是0、false或null。所有的静态字段初始化方法以及静态初始化块都将依照类声明中出现的顺序执行。
     

    实战

    下面的程序会展示很多特性

    • 重载构造器
    • this(...)调用另一个构造器
    • 无参数构造器
    • 对象初始化块
    • 静态初始化块
    • 实例字段初始化
    highlighter- Java
    import java.util.Random;
    
    
    public class ConstructorTest {
        public static void main(String[] args) {
            Employee2[] staff = new Employee2[3];
            staff[0] = new Employee2("Harry", 40000);
            staff[1] = new Employee2(60000);
            staff[2] = new Employee2();
    
            for (Employee2 e: staff) {
                System.out.println("name=" + e.getName() + ", id=" + e.getId() + ", salary=" + e.getSalary());
            }
        }
    }
    
    class Employee2 {
        private static int nextId;
        private int id;
        private String name = "";
        private double salary;
    
        // 静态初始化块
        static {
            Random generator = new Random();
            // 设置在0-9999之间的随机数变量nextId
            nextId = generator.nextInt(10000);
        }
    
        // 对象初始化块
        {
            id = nextId;
            nextId++;
        }
    
        /**
         * 3个重载构造函数
         */
        public Employee2(String n, double s) {
            this.name = n;
            this.salary = s;
        }
    
        public Employee2(double s) {
            this("新名字" + nextId, s);
        }
    
        public Employee2() {}
    
        public String getName() {
            return name;
        }
    
        public double getSalary() {
            return salary;
        }
        public int getId() {
            return id;
        }
    }

    运行结果如下:

    highlighter- Python
    name=Harry, id=2775, salary=40000.0
    name=新名字2776, id=2776, salary=60000.0
    name=, id=2777, salary=0.0

    __EOF__

  • 本文作者: Silent丿丶黑羽
  • 本文链接: https://www.cnblogs.com/jiakecong/p/16495218.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    “RunningEventsDuration“ app Tech Support(URL)
    设计模式使用场景实现示例及优缺点(结构型模式——代理模式、外观模式)
    自然语言处理(NLP)—— 神经网络自然语言处理(2)实际应用
    【Linux】账户密码过期
    密码md5加密处理
    吃透这份“腾讯限量版”Java架构笔记,要个40k不过分吧
    国鑫受邀出席2023英特尔中国区数据中心渠道客户金秋会
    Vite:轻量级的前端构建工具
    Word处理控件Aspose.Words功能演示:使用 Python 保护 Word 文档
    Nginx补充部分--IO模型
  • 原文地址:https://www.cnblogs.com/jiakecong/p/16495218.html