类的结构之构造器

构造器的使用----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("人吃饭");
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值