构造方法

作者: 许宏川 | 来源:发表于2015-06-14 01:58 被阅读625次

    是否想过创建对象时发生了什么?
    例如<code>Person p = new Person();</code>是在做什么?

    答案是在调用类的构造方法。
    构造方法也是方法吗?
    是的。
    在哪啊?我没有写什么构造方法啊。
    就是因为你没写所以Java隐式帮你创建了。
    怎么自己创建啊?
    向下面这样:

    public class Person {
       
        //无参构造方法
        public Person() {
           
        }
       
    }
    

    构造方法和普通方法本质是一样的,只是语法上方法名和类名相同且没有返回值类型。当你new一个Java对象时Java会去执行你的构造方法。如果自己不创建构造方法讲会隐式创建一个示例中这样的空构造方法。

    怎么证明new一个新对象的时候会执行这个构造方法呢?
    试一下呗,把构造方法添加方法体输出一句话,然后在Test类里测试一下:

    //无参构造方法
    public Person() {
        System.out.println("执行了无参构造方法");
    }
    
    Person p = new Person();
    

    运行结果:
    <pre>
    执行了无参构造方法
    </pre>

    构造方法和普通方法一样,也可以有参数和进行方法重载。
    我们给Person多加几个属性:

    public class Person {
       
        public String name;
        public int age;
       
        //无参构造方法
        public Person() {
            System.out.println("执行了无参构造方法");
        }
       
        //带参数构造方法
        public Person(String name) {
            this.name = name;
        }
       
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
       
    }
    

    测试一下:

    Person p = new Person();
    Person zhangsan = new Person("张三");
    Person lisi = new Person("李四", 22);
    

    运行结果:
    <pre>
    执行了无参构造方法
    执行了String name构造方法
    执行了String name, int age构造方法
    </pre>

    示例new了三个Person对象,每次传进去的参数不一样,执行的构造方法也不要一样。所以每new一个新对象构造方法就会被执行。构造方法通常用于对对象进行初始化。

    最后还有一点要注意,如果你的类里已经有构造方法时,Java将不再会自动创建一个无参且方法体为空的构造方法。
    例如我把无参构造方法注释掉,然后再编译代码

    /*
    //无参构造方法
    public Person() {
        System.out.println("执行了无参构造方法");
    }
    */
    

    编译时会出现“找不到合适的构造器”的错误。
    <pre>
    Test.java:4: 错误: 对于Person(没有参数), 找不到合适的构造器
    Person p = new Person();
    ^
    构造器 Person.Person(String)不适用
    (实际参数列表和形式参数列表长度不同)
    构造器 Person.Person(String,int)不适用
    (实际参数列表和形式参数列表长度不同)
    1 个错误
    </pre>

    本文代码下载:百度网盘

    相关文章

      网友评论

        本文标题:构造方法

        本文链接:https://www.haomeiwen.com/subject/ybvjqttx.html