构造器的使用----Constructor
1、什么是构造器
- 构造器通常也叫构造方法、构造函数,构造器在每个项目中几乎无处不在。
- 构造器最大的用处就是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始化。如果想改变这种默认的初始化,就可以通过自定义构造器来实现。
[修饰符] 类名 (参数列表,可以没有参数){
//这里不能有return
}
2、构造器的作用
- 创建对象。
- 初始化对象的信息。
3、说明
-
默认构造器:
如果没有显示的定义构造器,则系统默认提供一个无参的构造器,所以有时定义了一个对象没有构造器却可以new出这个对象。但是,如果自定义构造器后,会覆盖默认构造器。
-
禁止对象被外部创建:
在一些特殊需求中,我们不希望定义的对象被外部创建(单例模式),我们可以将构造器的修饰符改为private即可,修改后,就不可以在外部通过new来创建这个对象。
-
构造器的重载:
- 与普通的方法一样,一个类中定义的多个构造器,彼此构成重载。
- 一个对象中是可以支持同时定义对个构造器,通过不同的参数列表来实现重载
- 例如:同一个对象new后,有时要传入参数,有时则不需要传入
//无参和有参
People person=new People();
People person=new People(”张三“);
-
返回值和返回类型:
实例方法可以返回任何类型的值或者无返回值(void),但是构造方法是没有返回类型的,void也不行。
-
构造器的继承:
子类构造器会默认调用父类无参构造器,如果父类没有无参构造器,则必须在子类构造器的第一行通过 super关键字指定调用父类的哪个构造器,final类是不允许被继承的,编译器会报错。很好理解,由于final修饰符指的是不允许被修改,而继承中,子类是可以修改父类的,这里就产生冲突了,所以final类是不允许被继承的。
/**
* 父类构造器
*/
public class SuperClass {
/**
* 自定义带参构造器
*/
public SuperClass(String str){
System.out.println("父类的带参构造方法,参数为:" + str);
}
}
------------------------------------------------------------------------------------
/**
* 子类构造器
*/
public class SubClass extends SuperClass {
/**
* 无参构造器
*/
public SubClass(){
//由于SuperClass没有无参构造器,所以必须在子类构造器中通过 super("字符串")来调用,否则编译器会报错。
//如果没定义该句,则编译器会默认调用 super()
super("");
}
/**
* 带参构造器
*/
public SubClass(String subStr){
//由于SuperClass没有无参构造器,所以必须在子类构造器中通过 super("字符串")来调用,否则编译器会报错。
//如果没定义该句,则编译器会默认调用 super()
super(subStr);
}
}
-
构造器、静态代码块、构造代码块的执行顺序:
- 无继承的情况下的执行顺序
静态代码块:只在程序启动后执行一次,优先级最高
构造代码块:任何一个构造器被调用的时候,都会先执行构造代码块,优先级低于静态代码块
构造器:优先级低于构造代码块
总结一下优先级:静态代码块 > 构造代码块 > 构造器 - 有继承的情况下的执行顺序:
父类静态代码块:只在程序启动后执行一次,优先级最高
子类静态代码块:只在程序启动后执行一次,优先级低于父类静态代码块
父类构造代码块:父类任何一个构造器被调用的时候,都会执行一次,优先级低于子类静态代码块
父类构造器:优先级低于父类构造代码
子类构造代码块:子类任何一个构造器被调用的时候,都会执行一次,优先级低于父类构造器
子类构造器:优先级低于子类构造代码块
总结一下优先级:父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造器 > 子类构造代码块 > 子类构造器
- 无继承的情况下的执行顺序
-
实例:
//实例
public class PersonTest {
public static void main(String[] args) {
//创建类的对象:new + 构造器
Person p = new Person();
p.eat();
Person p1=new Person("tom");
System.out.println(p1.name);
}
}
class Person{
String name;
int age;
//构造器
public Person(){
//无参构造
}
//有参构造
public person(String n){
name=n;
}
//方法
public void eat(){
System.out.println("人吃饭");
}
}