• java构造方法


    当我们不定义构造方法的时候,如果直接赋值会出现报错:

    package com.imooc.constructionmethod;
    
    class ExamplePerson {
        public String name;
        public int age;
    }
    
    public class example {
        public static void main(String[] args) {
            ExamplePerson mi = new ExamplePerson("mi",12);  //不能这样直接传参
            System.out.println(mi.name);
        }
    }

    执行结果:

    之前我们是这样:

    public class example2 {
        public static void main(String[] args) {
            ExamplePerson mi = new ExamplePerson();
            mi.name = "mi";    //直接给字段赋值
            System.out.println(mi.name);
        }
    }

     当然,还可以配置一个方法:

    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

      这样就可以获取值了:

    mi.setName("mi");
    System.out.println(mi.getName());

    但是这样,貌似有些麻烦,下面是python中实例化一个对象的示例:

    class Student(object):
    
        def __init__(self,name,score):
            self.name = name
            self.score = score
            
        def print_score(self):
            print('%:%s'%(self.name,self.score))

    然后示例化就是如下方式:

    bart = Student('Bart Simpson',59)
    lisa = Student('Lisa Simpson',87)

    其实python之所以可以这样,就是因为__init__是构造函数。其实在java中,也是有构造方法的

    package com.imooc.constructionmethod;
    
    class ExamplePerson3 {
        private String name;
        private int age;
    
        public ExamplePerson3(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
    }
    
    public class example3 {
        public static void main(String[] args){
            ExamplePerson3 mao = new ExamplePerson3("mao",18);
            System.out.println(mao.getName());
            System.out.println(mao.getAge());
        }
    }

    这样在创建这个对象的时候,就可以实例化对象的属性,与python创建一个对象类似。
    我们可以看到,上面的构造方法与类名一样。与普通函数不同的是,构造方法没有返回值。
    需要注意的是,调用构造方法必须使用new操作符。

    1.默认构造方法

    是不是任何类都有构造方法了?是。
    之前很多示例,我们都没有配置构造方法,为啥还是new Person可行的?

    package com.imooc.objectoriented;
    
    class Person {
        private String name;
        private int age;
    }
    
    public class ObjectMethod {
        public static void main(String[] args) {
            Person ming = new Person();
            ming.name = "mingwang";
            ming.age = 26;
            System.out.println(ming.name);
        }
    }

    因为如果一个类没有配置构造方法,那么编译器会自动为我们生成一个构造方法,他没有参数,也没有执行语句,就这样:

    class Person {
        ....
        public Person(){
        }
    }

    2.多构造方法

    如果既要使用不带参数的构造方法,也想使用带参数的构造方法,那么就必须把两个构造方法都配置出来。

    可以给一个类定义多个构造方法,在通过new操作符调用的时候,编译器会通过构造方法的参数数量、位置和类型来选择构造方法。

    package com.imooc.constructionmethod;
    
    class ExamplePerson3 {
        private String name = "mao";
        private int age = 18;
        public ExamplePerson3(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public ExamplePerson3() {
            this.name = name;
            this.age = 12;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
    }
    
    public class example3 {
        public static void main(String[] args){
            ExamplePerson3 ming = new ExamplePerson3("ke",27);
            System.out.println(ming.getName());  //ke
            System.out.println(ming.getAge());   //27
            ExamplePerson3 king = new ExamplePerson3("king");  //编译器会根据参数个数来选择构造方法
            System.out.println(king.getName());  //king
            System.out.println(king.getAge());   //12
        }
    }

    构造方法还可以调用其他的构造方法,以此来提高代码的复用,通过this的形式。

    package com.imooc.constructionmethod;
    
    class ExamplePerson3 {
        private String name = "mao";
        private int age = 18;
        public ExamplePerson3(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public ExamplePerson3() {
            this("niao",3);  //构造方法还可以调用其他的构造方法,通过this形式
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
    }
    
    public class example3 {
        public static void main(String[] args){
            ExamplePerson3 ming = new ExamplePerson3("ke",27);
            System.out.println(ming.getName());  //ke
            System.out.println(ming.getAge());   //27
            ExamplePerson3 king = new ExamplePerson3();  //
            System.out.println(king.getName());  //niao
            System.out.println(king.getAge());   //3
        }
    }

    3.初始化赋值

    在一个对象已经构造完成的时候,其属性其实已经填充完毕。

    package com.imooc.constructionmethod;
    
    class ExamplePerson3 {
        private String name;  //null
        private int age;  //0
    
        public ExamplePerson3() {}
    
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
    }
    
    public class example3 {
        public static void main(String[] args){
            ExamplePerson3 ming = new ExamplePerson3();
            System.out.println(ming.getName());  //null
            System.out.println(ming.getAge());   //0
        }
    }

    在上述示例中,我们并没有赋值,但是每个属性都已经有值。
    属性的默认值是其字段类型的默认值。

    当然,还可以在定义属性的时候,直接定义值:

    package com.imooc.constructionmethod;
    
    class ExamplePerson3 {
        private String name = "mao";
        private int age = 18;
    
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
    }
    
    public class example3 {
        public static void main(String[] args){
            ExamplePerson3 ming = new ExamplePerson3();
            System.out.println(ming.getName());  //mao
            System.out.println(ming.getAge());  //18
        }
    }

    那么,既对字段进行初始化,又调用了构造函数,字段该如何取值了?

    package com.imooc.constructionmethod;
    
    class ExamplePerson3 {
        private String name = "mao";
        private int age = 18;
        public ExamplePerson3(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
    }
    
    public class example3 {
        public static void main(String[] args){
            ExamplePerson3 ming = new ExamplePerson3("ke",27);
            System.out.println(ming.getName());  //ke
            System.out.println(ming.getAge());   //27
        }
    }

    在Java中创建对象示例的时候,按照如下顺序进行初始化:
    (1)先初始化字段,如果没有给值,那么采用默认值。
    (2)执行构造方法的代码进行初始化。

    因此上方函数会显示构造方法的赋值。

  • 相关阅读:
    如何自建appender扩展Log4j框架
    在O(1)时间删除链表结点
    My First GitHub
    JAVA序列化和反序列化
    [转]Vim 复制粘帖格式错乱问题的解决办法
    Centos清理内存 内存回收释放及内存使用查看的相关命令
    Spark HA 的搭建
    Ambari安装
    Hadoop HA的搭建
    Hadoop32位和64位的查询
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/12500027.html
Copyright © 2020-2023  润新知