java基础知识巩固(继承、构造方法)

把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); 
  }
}

输出结果为:注意下面的SuperClass()

SuperClass(int n)
SubClass
SuperClass()
SubClass(int n):200

你可能感兴趣的:(java基础巩固)