把java的一些之前掌握的不牢的知识点巩固一下
1、如果父类只有带有参数的构造方法,则必须在子类的构造方法中显式地通过super关键字调用父类的构造方法并配以适当的参数列表,否则会报错。
class Father {
public Father(String name) {
System.out.println("Father的带参构造方法");
}
}
class Son extends Father {
public Son() {
super("XXX");
System.out.println("Son的无参构造方法");
}
public Son(String name) {
super("XXX");
System.out.println("Son的带参构造方法");
}
}
class ExtendsDemo {
public static void main(String[] args) {
Son s = new Son();
System.out.println("----------------");
Son ss = new Son("XXX");
}
}
2、如果父类存在无参构造方法,则在子类的构造方法中用super调用父类构造方法不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造方法。
换句话说,这时,子类中所有的构造方法默认 都 会访问父类中的空参构造方法。可以这样理解其中的原因:由于子类会继承父类中的数据,甚至使用父类中的数据。所以,子类在初始化之前,一定要先完成父类数据的初始化,即,子类每一个构造方法的第一条语句隐含默认为"super();"。
3、子类可以通过this去调用本类的其他构造方法,但子类中一定要至少有一个去访问了父类的构造方法,否则父类数据就没有初始化,这时this()访问本类构造函数(本类构造函数中又有super() ),即相当于间接访问父类的构造方法。
class Father {
/*
public Father() {
System.out.println("Father的无参构造方法");
}
*/
public Father(String name) {
System.out.println("Father的带参构造方法");
}
}
class Son extends Father {
public Son() {
super("XXX");//至少有一个要访问父类的构造方法
System.out.println("Son的无参构造方法");
}
public Son(String name) {
//super("XXX");
this();//用this来访问本类的无参构造方法,保证其他地方至少有一个要访问父类的构造方法
System.out.println("Son的带参构造方法");
}
}
class ExtendsDemo {
public static void main(String[] args) {
Son s = new Son();
System.out.println("----------------");
Son ss = new Son("XXX");
}
}
另外注意:
this(...)或者super(...)必须出现在构造方法的第一条语句上。
如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。
class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
class SubClass extends SuperClass{
private int n;
SubClass(){
super(300);
System.out.println("SubClass");
}
public SubClass(int n){
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
public class TestSuperSub{
public static void main (String args[]){
SubClass sc = new SubClass();
SubClass sc2 = new SubClass(200);
}
}
class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
class SubClass extends SuperClass{
private int n;
SubClass(){
super(300);
System.out.println("SubClass");
}
public SubClass(int n){
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
public class TestSuperSub{
public static void main (String args[]){
SubClass sc = new SubClass();
SubClass sc2 = new SubClass(200);
}
}
输出结果为:注意下面的SuperClass()
SuperClass(int n) SubClass SuperClass() SubClass(int n):200