构造方法的学习笔记

  • 构造方法存在的意义:

构造方法存在的意义就是能够让程序员在new对象的同时就对类的成员变量进行赋值

  • 构造方法的定义格式:

权限修饰符  类名  (参数列表) {

普通方法的定义格式:

权限修饰符   方法名  (参数列表) {

  • 构造方法的定义格式的注意事项:

方法的名字必须和类名完全一致,且不允许有返回值类型(包括void也不能写)

  • 构造方法的运行时间:

构造方法是在创建对象的同时,构造方法会自动执行,而且它只运行一次,new对象实际上就是在调用构造方法

  • 注意事项

构造方法,你不写它也有,当你不写的时候,javac(编译器)会在编译的时候自动给你添加一个构造方法,java中默认的构造方法是:

public    类名   (空参表列) {

  super();//父类的构造方法

java中每一个类都必须有构造方法,只要是类就有构造方法

  • 在创建对象调用构造方法,内存中发生的事情:

首先,对象进入堆内存,对自己的成员变量赋默认值,然后对象调用自己的构造方法,构造方法进入栈中运行,this指针接收对象在堆内存的地址,由this调用对象的成员变量,成员变量在构造方法内完成赋值,接着,构造方法弹栈死亡,至此整个创建对象的过程才算结束

  • 构造方法的细节知识:
  1. 一个类是可以有多个构造方法,多个构造方法也可以像普通方法一样以重载的形式存在(注意:重载只看函数的参数列表是否不同)
  2. 构造方法如果被private关键字修饰,那么外类就无法通过该构造方法去创建对象
  • this关键字在构造方法之间的调用:

1.以    this(参数表列)   的形式调用其他的构造方法,()里面的参数表列就是其他构造方法里面的参数表列,以括号里面的参数表列来确定调用的是哪一个构造方法;

2.注意事项:this()这条语句必须在构造方法里面所有语句的第一行,否则就会编译失败

  • super关键字在子父类构造方法中调用

1.以   super(参数表列)   的形式调用父类的构造方法()内的参数表列就是父类构造方法的参数表列,以()内的参数表列来区分调用的是父类的哪一个构造方法

2.注意事项:子类构造方法的第一行有一个隐式的代码super();

子类的构造方法无论是javac添加的还是程序员自己定义的,这个super()语句都存在

  1. 这么做的原因就在于:能够让子类知道父类的成员是如何赋值的

10.子父类成员拥有继承关系后,在内存上的变化:

     1.首先父类先进方法区,之后子类再进方法区,然后main方法压栈运行,当在main方法中创建子类对象时,JVM会为子类对象在堆内存中划分一块区域,该区域又会被分为两部分,其中一部分用来存放父类的成员,另一部分用来存放子类自己的成员,然后父类的成员跟随子类的对象进入堆内存

     2.在创建子类对象的时候,子类对象会自己主动调用自己的构造方法,而子类自己的构造方法的第一行代码又是super();用来调用父类的构造方法,所以是子类的构造方法先压栈执行,然后父类的构造方法再压栈执行,最后父类构造方法弹栈死亡,子类构造方法弹栈死亡

11.super的再讨论

        1.当父类的构造方法中有参数时,子类中构造方法的第一行是super(), 这时super()里面的参数表列一定要和父类中的保持一致,否则会编译失败,比如以下代码展示:

         构造方法的学习笔记

    2.super();关键字在子类构造方法中必须在第一行,this();在子类构造方法中也必须是第一行,不能同时存在,但是可以任选其一,只要保证子类的所有构造方法都能调用到父类的构造方法即可,无论是直接访问还是间接访问:

        如下图:

直接访问,就是将子类构造方法的第一行全部写为super()

        间接访问,就是将子类的构造方法的其中一个或多个的第一行写成super(),而让没有写super(),写上this()即可,这样,这些写this()的就可以通过本类中的其他能访问到父类的构造方法间接的访问到父类

         构造方法的学习笔记   

结论:无论如何,子类所有的构造方法,直接,间接必须调用到父类构造方法