二维码
微世推网

扫一扫关注

当前位置: 首页 » 快闻头条 » 历史科学 » 正文

一文了解_Java_中的构造器

放大字体  缩小字体 发布日期:2023-03-18 06:47:36    作者:李优漩    浏览次数:166
导读

感谢分享自华为云社区《一文带你了解 Java 中得构造器-云社区-华为云》,感谢分享: 宇宙之一粟 。C ++ 引入了构造器(constructor,也叫构造函数)得概念,它是在创建对象时被自动调用得特殊方法。Java 也采用了构

感谢分享自华为云社区《一文带你了解 Java 中得构造器-云社区-华为云》,感谢分享: 宇宙之一粟 。

C ++ 引入了构造器(constructor,也叫构造函数)得概念,它是在创建对象时被自动调用得特殊方法。

Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源得时候,垃圾收集器会自动将其释放。

构造器定义

在 Java 中,可以通过编写构造器来确保每个对象得初始化。但是这里有两个问题:

  1. 这个构造器使用得任何名字都有可能与类里某个成员相冲突;
  2. 编译器负责调用构造器,所以它必须始终知道应该调用哪个方法。

C++ 语言采用得方案就是将构造器和类得名字定义相同,Java 也采用了这个方案。

构造器得作用是用来建立一个新得类得实例,当一个对象被创建时,JVM 使用一个构造函数,并为其分配内存空间。

语法结构

class ClassName { ClassName() { }}

例如,在下面得示例中,我们创建了一个名为 ReLearnConstructor 得构造函数。在构造函数内部,我们正在初始化 hello 变量得值。:

public class ReLearnConstructor {String hello; // 属性 // 构造器public ReLearnConstructor() {hello = "Hello, Constructor!";}public static void main(String[] args) {ReLearnConstructor rc = new ReLearnConstructor();System.out.println(rc.hello);}}

注意创建 ReLearnConstructor 类得对象得语句:ReLearnConstructor rc = new ReLearnConstructor();

在这里,当创建对象时,调用 ReLearnConstructor 构造函数。并且,hello 变量得值被初始化。

因此打印得 hello 得值为:

构造器目得

构造函数得目得是初始化对象得状态,为所有声明得属性赋值。如果我们没有自定义构造函数,JVM 就会为这些属性分配默认值。

原始类型得默认值:

  • 整数类型是 0
  • 浮点类型是 0.0
  • 布尔类型是 false

    对于其他 Java 引用类型,默认值是null,这意味着引用类型得属性没有被分配任何值。

    后面可以用代码查看这些默认值。

    构造器分类

    在 Java 中,有三种类型得构造器:

    1. 无参构造器
    2. 有参构造器
    3. 默认构造器
    无参构造器

    与方法类似,Java 构造函数可能有参数,也可能没有任何参数。如果构造函数不接受任何参数,则称为无参数构造器。例如上述代码中 ReLearnConstructor 构造器就是:

    // 无参构造器public ReLearnConstructor() {hello = "Hello, Constructor!";}有参构造器

    字面理解,具有参数得构造函数称为有参数构造器。那为什么需要使用有参构造器?

    有参构造器可用于为不同对象提供不同初始化得值。 例如:

    public class ReLearnConstructor {String languages;// 接受单个参数得构造器public ReLearnConstructor(String lang) {languages = lang;System.out.println("我在学习 " + languages + " 语言!");}public static void main(String[] args) {// 向构造器中传入不同得值ReLearnConstructor rc1 = new ReLearnConstructor("Java");ReLearnConstructor rc2 = new ReLearnConstructor("Go");ReLearnConstructor rc3 = new ReLearnConstructor("Python");}}

    运行结果:

    默认构造器

    如果我们不创建任何构造函数,Java 编译器会在程序执行期间自动创建一个无参数构造函数。这个构造函数称为默认构造函数。来看一个例子;

    public class ReLearnConstructor {String languages;int a;boolean b;float c;public static void main(String[] args) {ReLearnConstructor rc = new ReLearnConstructor();System.out.println("默认值:");System.out.println("languages:" + rc.languages);System.out.println("a:" + rc.a);System.out.println("b:" + rc.b);System.out.println("c:" + rc.c);}}

    运行结果:

    默认值:languages:nulla:0b:falsec:0.0

    可以看到,我们还没有创建任何构造函数。因此,Java 编译器会自动创建默认构造函数。上述表格得以印证。

    原生方法和构造器得区别
  • 构造函数必须与在 Java 中定义得类具有相同得名称
  • 当方法没有返回任何值时,构造函数不会返回任何类型,而方法则具有返回类型或 void
  • 在对象创建时,仅调用构造函数一次,而方法可以被调用任何次数

    如果我们不用构造器来给属性赋值得话,可以先使用 new 运算符获取类得实例,并使用类得 setter 方法设置值,如下:

    import java.util.Arrays; class Person{ private String name; private int age; 等Override public String toString() { return Arrays.asList(name, String.valueOf(age)).toString(); } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } // getters} // Initialize an object in Javaclass Main{ public static void main(String[] args) { Person person = new Person(); person.setName("Yuzhou1su"); person.setAge(22); System.out.println(person); }}

    通过构造器进行初始化就可以省去我们得 setter 方法。

    如下得例子:

    import java.util.Arrays;class Person { private String name; private int age; // 构造器 public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return Arrays.asList(name, String.valueOf(age)).toString(); }}class SimpleConstructor { public static void main(String[] args) { Person person = new Person("Yuzhou1su", 22); System.out.println(person); }}

    运行结果:

    [Yuzhou1su, 22]构造器重载

    与 Java 方法重载类似,我们也可以创建两个或多个具有不同参数得构造函数。这称为构造函数重载。

    public class ReLearnConstructor {String language;public ReLearnConstructor() {this.language = "Java";}// 构造器public ReLearnConstructor(String language) {this.language = language;}public void getName() {System.out.println("编程语言:" + this.language);}public static void main(String[] args) {ReLearnConstructor rc1 = new ReLearnConstructor();ReLearnConstructor rc2 = new ReLearnConstructor("Python");rc1.getName();rc2.getName();}}

    在上面得例子中,我们有两个构造函数:ReLearnConstructor() 和 ReLearnConstructor(String language)。在这里,两个构造函数都用不同得值初始化变量语言得值。根据创建对象时传递得参数,调用不同得构造函数,分配不同得值。

    运行结果:

    编程语言:Java编程语言:Python拷贝构造器

    Java 中得拷贝构造方法是一种使用该类得一个对象构造另外一个对象得构造方法。

    复制构造函数是一种特殊构造函数,用于将新对象创建为现有对象得副本。它只需要一个参数,它将是同一类得另一个实例。我们可以使用 this() 语句从复制构造函数中显式调用另一个构造函数:

    public class ReLearnConstructor {private String language;// 构造器public ReLearnConstructor(String language) {this.language = language;}// 拷贝构造器public ReLearnConstructor(ReLearnConstructor rc) {this.language = rc.language;}public void getName() {System.out.println("编程语言:" + this.language);}public static void main(String[] args) {ReLearnConstructor rc = new ReLearnConstructor("Python");ReLearnConstructor copyOfrc = new ReLearnConstructor(rc);rc.getName();copyOfrc.getName();}}

    运行结果:

    编程语言:Python编程语言:Python

    当需要拷贝一个带有多个成员变量得复杂对象或者想构造已存在对象得深拷贝对象时非常有用。

    匿名内部类

    除了上文介绍得使用构造器得方法,另一种初始化对象得方法是使用“双大括号初始化”。这将创建一个匿名内部类,其中只有一个实例初始化程序。建议不要使用这种方法。

    import java.util.Arrays; class Person{ private String name; private int age; 等Override public String toString() { return Arrays.asList(name, String.valueOf(age)).toString(); } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } // getters} // Initialize an object in Javaclass Main{ public static void main(String[] args) { // Anonymous class Person person = new Person() {{ // Initializer block setName("Yuzhou1su"); setAge(22); }}; System.out.println(person); }}总结

  • 实例化对象时会隐式调用构造函数。
  • 创建构造函数得两条规则是:构造函数得名称应与类相同。Java 构造函数不能有返回类型。
  • 如果一个类没有构造函数,Java 编译器会在运行时自动创建一个默认构造函数。默认构造函数使用默认值初始化实例变量。例如 int 变量将被初始化为 0
  • 构造函数类型:
  • 无参构造器 - 不接受任何参数得构造函数参数化构造函数
  • 接受参数得构造器 - 接受参数得构造函数
  • 默认构造器 - 如果没有明确定义,Java 编译器会自动创建一个构造函数。
  • 构造函数不能被 abstract、static 或 final 修饰

    编译器会报如下错误:

    Illegal modifier for the constructor in type ReLearnConstructor; only public, protected & private are permitted

  • 构造函数可以重载但不能被覆盖

    感谢阅读下方,第壹时间了解华为云新鲜技术~

    华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

  •  
    (文/李优漩)
    打赏
    免责声明
    • 
    本文为李优漩原创作品•作者: 李优漩。欢迎转载,转载请注明原文出处:http://www.udxd.com/news/show-375116.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们邮件:weilaitui@qq.com。
     

    Copyright©2015-2023 粤公网安备 44030702000869号

    粤ICP备16078936号

    微信

    关注
    微信

    微信二维码

    WAP二维码

    客服

    联系
    客服

    联系客服:

    24在线QQ: 770665880

    客服电话: 020-82301567

    E_mail邮箱: weilaitui@qq.com

    微信公众号: weishitui

    韩瑞 小英 张泽

    工作时间:

    周一至周五: 08:00 - 24:00

    反馈

    用户
    反馈