关注「Java视界」公众号,获取更多技术干货

JAVA构造方法

1、什么是构造方法?

方法名与类名相同、用于实例化对象时初始化该对象属性的无返回值的方法。如下为一个有参构造方法:

class Ball{
    private String name;
    private double size;
    //方法名与类名相同,且无返回值,连void型也没有
    public Ball(String str, double n){
        name = str;//初始化类的属性
        size = n;
    }
}

2、构造方法需要注意一下几点:

  • 只有在new关键字创建对象时才调用;
  • 一个类至少存在一个构造方法(当类中未定义构造方法时,编译时会自动创建一个无参构造方法,当已经创建了构造方法时,编译时就不会自动创建无参构造);
  • 构造方法是可以重载的,和普通方法重载时一样,与返回值无关,只需考虑参数的类型和个数;
  • 构造方法无返回值,且不能用void修饰

3、几个疑问:

(1)既然构造方法无返回值,为啥不能用void修饰?

首先要知道,普通方法与构造方法最大的区别是两者调用时机不同,构造方法是在实例化对象时调用的,而普通方法是对象产生以后再调用的。

如果构造方法也是用void修饰的话,除了方法名与类名一致,整个结构就和普通方法一样了。这样编译器无法分辨这就是一个构造方法,会把这个方法按照普通方法来对待,这样你想初始化对象的目的就无法实现。

(2)多个构造方法书写格式?

一个类中定义多个构造方法时,因为区别仅在于参数类型及个数,推荐按照参数个数降序或升序排列,使得代码有条理一些。

class Ball{
    private String name;
    private double size;

    public Ball(){
        name = "你大爷";
        size = 20;
    }  
    public Ball(String str){
        name = "你二大爷";
    }
    public Ball(String str, double n){
        name = str;
        size = n;
    }
}

4、一个构造方法想调用另一个构造方法怎么调用?this(),这样调用必须放第一位吗?

this()调用本类的无参构造方法

this(实参列表)调用本类的带参构造方法

super()调用直接父类的无参构造方法

super(实参列表)调用直接父类的带参构造方法

this()必须放第一位

为什么构造器中this 或者 super 要放到第一行?

this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
也就是说你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。无法执行当前的类的构造器,也就不能实例化任何对象,这个类就成为一个无为类。
从另外一面说,子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行。

5、super与this的区别

(1)super()子类中调用父类的构造方法,this()在同一类内调用其它方法。

(2)this和super不能同时出现在一个构造函数里面。

(3)super()和this()均需放在构造方法内第一行。

(4)this()和super()都指的是对象,所以,均不可以在static环境中使用。


 

posted @ 2022-06-25 14:03  沙滩de流沙  阅读(56)  评论(0编辑  收藏  举报

关注「Java视界」公众号,获取更多技术干货