构造器与方法重载

在编写的每个类中都会定义一个initialize(),会提醒你使用对象前调用initialalize(),创建一个构造器。构造器采用与类相同的名字。如果我们没有给数据成员赋予初始化值,数据成员会更急其类型采用默认初始值(无参构造器)。

显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。

定义构造器

一、构造器是干什么用的?(what)

     构造器是用来生成一个类的实例是用来初始化这个实例用的

二、构造器如何工作?(how)

     Java在构造实例时的顺序是这样的:

  

1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。   

2、执行属性值的显式初始化   

3、执行构造器   

4 、将变量关联到堆中的对象上

基本特征如下:

1.构造器的名字与类名相同

2.构造器没有返回值

public class Test2 {
    public static void main (String[]args){
        Bird bird = new Bird(3);
        System.out.println(bird.getAge());
    }
}

class Bird{
    private int age;//成员变量

    Bird(int age){
        this.age = age;//局部变量
        System.out.println("my age is");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
/*out 
my age is
3    */ 

此时构造器整体就放入了main方法中,其中做了2件事

  • 把局部变量的值赋予给成员变量 this.age = age ;
  • 输出语句 System.out.println("my age is");

构造器是怎么使用的呢?通过创建new Bird(new Bird())的形式,调用Bird构造器。其实Java都会默认提供一个无参构造器,当你定义了构造器,Java会调用定义的构造器,把age初始化为3。

初始化方法的优先级

通过debug测试可以看到其顺序,如果成员变量有值的话,会采用成员变量的值。但是最终经过构造器中,通过构造器获取的局部变量最终对成员变量进行赋值。

public Test{
    public static void main (String[]args){
        Bird bird = new Bird(3);
        System.out.println(bird.getAge());
    }
}

class Bird{
    private int age = 4;
    
    Bird(int age){   // 先获得3
       this.age = age;//经过成员变量获得4,但最终经过构造器获得3
    }
    
     public int getAge() {
        return age;
    }
}
/*
* out
* 3
*/

最终结果是3。

顺序是  构造方法 > 成员变量

通过Thinking in Java中的一段关于初始化顺序,可以自己debug看看顺序

class Window {
    Window(int marker) { System.out.println("Window(" + marker + ")"); }
}

class House {
    Window w1 = new Window(1); // Before constructor 
    House() {                                       
        // Show that we're in the constructor:
        System.out.println("House()");
        w3 = new Window(33); // Reinitialize w3
    }
    Window w2 = new Window(2); // After constructor
    void f() { System.out.println("f()"); }
    Window w3 = new Window(3); // At end
}

public class OrderOfInitialization {
    public static void main(String[] args) {
        House h = new House();
        h.f(); // Shows that construction is done
    }
}
/*
* Window(1)
* Window(2)
* Window(3)
* House()
* Window(33)
* f()
*/

构造器方法重载

一个类中可以定义不止一个构造器,通过方法重载可以构造多个构造器

public Test3{
    public static void main(String[]args){
        Bird bird = new Bird(3,"bugu");
        System.out.println(bird.getAge());
    }
}

clas Bird{
    private int age;
    private String s;

    Bird(int age){ //不适用
    this.age = age;
}    

    Bird(int age, String s){
    this.age = age;
    this.s = s;
    System.out.println("Im say "+s);
    }

      int getHeight()
    {
        return this.height;
    }

    public String getS() {
        return s;
    }
}
/*
* out
* Im say bugu
* 3
*/

上面定义了2个构造器,名字都是Bird。但在new一个新对象时,Java会根据提供的参数选择对应的构造器。

chong

在面试中也会被经常问一道题构造器可以被重写(Override)吗?

答:不能,首先构造器不能被继承,(因为每个类名不同,构造器又和类名相同,所以没法继承)。所以没法重写,

只能重载。

 

猜你喜欢

转载自blog.csdn.net/SneakyRogue/article/details/83650777