Java(14)构造方法

构造方法 (构造器constructor)

功能:初始化实例

1、使用方法

  • 构造方法的名称就是类名,且修饰符跟类一致

  • 构造方法的参数没有限制,在方法内部,可以编写任意语句

  • 和普通方法相比,构造方法没有返回值,也没有void关键字

  • 调用构造方法,必须使用new操作符

    public class HelloG {
        public static void main(String[] args) {
            Person a=new Person("Jimmy",21);  //静态方法不能访问非静态内部类
            System.out.println(a.name);
            System.out.println(a.age);
        }
        public static class Person{  //这里一定要加static非访问修饰符
            private String  name;
            private int age;
    
            public Person(String name,int age){
                this.name=name;
                this.age=age;
            }
    
        }
    }
    //=========================将Person类改为外部类==================================
    public class HelloG {
        public static void main(String[] args) {
            Person a = new Person("Jimmy", 21);
            System.out.println(a.GetName());
            System.out.println(a.GetAge());
        }
    
    }
    
    class Person {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String GetName(){
            return this.name;
        }
        public int GetAge(){
            return this.age;
        }
    }
    
    

2、默认构造方法

默认构造方法没有参数,也没有执行语句, 如果一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法。

默认构造方法如下:

public class HelloA {
    public HelloA(){}
}

如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法

public class HelloG {
    public static void main(String[] args) {
        Person a=new Person();  //会编译错误
        System.out.println(a.name);
        System.out.println(a.age);
    }
}
class Person{  
    private String  name;
    private int age;

    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
}

如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么只能把两个构造方法都定义出来:

public class HelloG {
    public static void main(String[] args) {
        Person a=new Person();  //不会编译错误
        System.out.println(a.name);
        System.out.println(a.age);
    }
}
class Person{  
    private String  name;
    private int age;

    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public Person() {
        
    }
}

3、未初始化字段默认值

没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值(可回看八大基本类型),int类型默认值是0,布尔类型默认值是false

public class HelloG {
    public static void main(String[] args) {
        Person a=new Person();  //会编译错误
        System.out.println(a.GetName());
        System.out.println(a.GetAge());
        System.out.println(a.GetSex());
    }
}
class Person{  //这里一定要加static非访问修饰符
    private String  name;
    private int age;
    private boolean Sex;
    public Person() {

    }
    public String GetName(){
        return this.name;
    }
    public int GetAge(){
        return this.age;
    }
    public boolean GetSex(){
        return this.Sex;
    }
}

/*结果为:
null
0
false
*/

4、字段初始化顺序

如果创建字段的时候就初始化了,而且构造方法再初始化一遍,所以最终的值由构造方法的代码确定

public class HelloB {
    public static void main(String[] args) {
        PersonB b=new PersonB(21,"Krystal");
        System.out.println(b.GetName());
        System.out.println(b.GetAge());
    }
}
class PersonB{
    private int age=21;
    private String name="Jimmy";
    public PersonB(int age,String name){
        this.age=age;
        this.name=name;
    }
    public int GetAge(){
        return this.age;
    }
    public String GetName(){
        return this.name;
    }
}

5、多个构造方法(构造器的重载)

构造方法既然是个方法,则表明可以进行重载,编译器通过参数数量、位置和类型自动区分构造方法

public class HelloB {
    public static void main(String[] args) {
        PersonB b=new PersonB(18);
        System.out.println(b.GetName());
        System.out.println(b.GetAge());
    }
}
class PersonB{
    private int age=21;
    private String name="Jimmy";
    //构造方法1
    public PersonB(int age,String name){
        this.age=age;
        this.name=name;
    }
    //构造方法2
    public PersonB(int age){
        this.age=age;
        this.name="Jimmy";
    }
    //构造方法3
    public PersonB(){

    }
    public int GetAge(){
        return this.age;
    }
    public String GetName(){
        return this.name;
    }

}
/*
输出结果为:
Jimmy
18
*/

6、构造方法调用构造方法

一个构造方法可以调用其他构造方法,这样 做的目的是便于代码复用。调用其他构造方法的语法是this(…)

package test;

public class TestOne {
    private String name;
    private int sizeA;

    public TestOne(String name, int sizeA) {
        this.name = name;
        this.sizeA = sizeA;
    }

    public TestOne(String name) {
        this(name, 18);
    }

    public TestOne() {
        this("krystal", 18);
    }
    public String getName(){
        return this.name;
    }
    public int getSizeA(){
        return this.sizeA;
    }

}

class TestA {
    public static void main(String[] args) {
        TestOne a=new TestOne();
        System.out.println(a.getName()+" "+a.getSizeA());
    }
}
//运行结果为:krystal 18
posted @ 2020-08-29 08:44  Whatever_It_Takes  阅读(191)  评论(0编辑  收藏  举报