java 构造函数一系列问题

来源:互联网 发布:linux网站开发 编辑:程序博客网 时间:2024/05/22 09:06
构造函数与类名
a. 类中的构造方法可以省略不写的
b. 构造方法必须跟类名相同,普通的类方法能与类同名的,但是要返回一个值。
c. 构造方法都在new 对象的时候调用的
d. 一个类可以定义多个构造方法的


本类构造调用本类构造:
1,this()
2,new data();
构造方法的继承:

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
1,父类无任何构造,子类无构,有参,无参,有两参四种情况都会初始化时或调用子类构造时自动调用父类的默认无参。然后执行子类构造。
2,父类定义了无参构造,子类无构,有参,无参,有两参四种情况都会初始化时或调用子类构造时首先调用父类的无参。当然可以在子类中super()来显示调用。然后执行子类构造。
3,父类定义了有参和无参,那么子类必须显示调用有参初始化父类变量,否则执行2.
4,父类只定义了有参,这是不会有默认无参,也没有无参,则必须显示调用有参初始化父类变量,否则执行2,报错。

构造原则如下:
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,父类没有定义构造,则会调用父类的默认无参构造函数。
4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:
[cpp] view plain copy



super,this问题。
0,显示调用父类有参构造,否则调用无参构造,没有则编译错误
1,this用于本类形参实参名相同时,用于指代实参,或成员方法,然可省略。
2,super可以在子类调用父类的成员或者方法
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
3,构造时,this(),this(a),super(无参),super(a);
4,构造函数中默认的第一条语句是super(),super()与this()不能同时出现在一个构造函数里,因为都必须是第一条语句
5,都不能在static中,是指对象的。

牢记初始化顺序(完全是这个)=》只初始化一次

虚拟机在首次加载Java类时,会对静态成员变量、静态初始化块、静态方法进行一次初始化。只执行一次,不随创建再执行。我们不要去纠结这里的顺序,一般来说我们只需要知道,静态方法一般在最后。
父类静态变量>父类B静态代码块->子类静态变量-》子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
静态初始化按声名顺序

类定义中,构造函数可以通过this,或者new A()调用其他构造函数。
构造函数有多种方式 所以是可以用private的 只是在外部这种方法不能给实例化


继承的初始化特点:
首先new了一个子类对象,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类的构造方法,这里通过super("B")显示的调用了父类的带参构造。执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为:
先调用C类的无参构造
再调用A类的带参构造
最后调用调用子类的构造
总结:
父类静态变量>父类B静态代码块->子类静态变量-》子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数

一个文件中可以有多个类,如果没有public类,则可以与任意类名相同,如果有public类则文件名必须与此类名相同,因为一个文件中只能有一个public类。如果文件中只有一个类,则文件名必须与类名相同,匿名类内部类等。

原创粉丝点击