一直學習java,都沒有把構造函數弄清楚,通過昨天的學習,現在有了一點點理解,不知道還有什么不知道的,望大家指導指導。
當父類沒有任何構造函數,子類定義了一個不帶參數的構造函數,這時候在測試類里面創建一個子類的對象時,程序運行時,首先調用系統默認的父類的構造函數,然后再調用子類的構造函數。例子:
public class SuperClass {
PRivate String name;
private String birthdate;
public void show() {
System.out.println("this is a public function" + name + birthdate);
}
}
public class SubClass extends SuperClass {
String address;
public SubClass() {
System.out.println("SubClass:this is a no parameter constructor");
}
public void personinformation(String _name, String _birth, String _address) {
System.out.println("output information" + _name + _birth + _address);
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass absence = new SubClass();
}
}
運行結果:SubClass:this is a no parameter constructor
當父類里面定義了幾個構造函數,其中至少有一個不帶參數,子類定義了一個不帶參數的構造函數,運行的時候,調用不帶參數的構造函數,然后再運行子類的構造函數。
public class SuperClass {
private String name;
private String birthdate;
public SuperClass() {
name = "chen";
birthdate = "feb";
System.out.println("SuperClass:this is a no parameter constructor");
}
public SuperClass(String chen, String febu) {
name = chen;
birthdate = febu;
System.out.println("this is parameter constructor:" + name + birthdate);
}
public void show() {
System.out.println("this is a public function" + name + birthdate);
}
}
public class SubClass extends SuperClass {
String address;
public SubClass() {
System.out.println("SubClass:this is a no parameter constructor");
}
public void personinformation(String _name, String _birth, String _address) {
System.out.println("output information" + _name + _birth + _address);
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass absence = new SubClass();
}
}
運行結果:SuperClass:this is a no parameter constructor
SubClass:this is a no parameter constructor
當父類中只定義帶參數的構造函數,父類定義的構造函數和上面的一樣,這樣程序運行就會出現錯誤,編譯不能通過,會出現錯誤提示。因為在創建子類對象時,由于沒有不帶參數的構造函數,它不知道要調用父類的那個構造函數。所以要在定義子類構造的第一行加上調用父類的構造函數:super("hhh");根據括號里面的參數類型、個數來確定調用父類里面的那個構造函數。例子:
public class SuperClass {
private String name;
private String birthdate;
public SuperClass(String chen, String febu) {
name = chen;
birthdate = febu;
System.out.println("this is parameter constructor:" + name + birthdate);
}
public SuperClass(String chen) {
name = chen;
System.out.println("this is parameter constructor1:" + name );
}
public void show() {
System.out.println("this is a public function" + name + birthdate);
}
}
public class SubClass extends SuperClass {
String address;
public SubClass() {
super("hhh"); //非常重要!根據他來調用父類的構造函數
System.out.println("SubClass:this is a no parameter constructor");
}
public void personinformation(String _name, String _birth, String _address) {
System.out.println("output information" + _name + _birth + _address);
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass absence = new SubClass();
}
}
運行結果:this is parameter constructor1:hhh
SubClass:this is a no parameter constructor
父類只有不帶參數的構造函數,如果父類里面有一個其他類的對象實例,子類里面同樣有一個其他類的對象實例 ,那么運行的時候后,首先運行的是父類里的那個類的構造函數,在運行父類的構造函數,然后運行子類里的那個類的構造函數,最后運行子類的構函數。
public class SuperClass {
private String name;
private String birthdate;
public SuperClass() {
name = "chen";
birthdate = "feb";
Circle2 c2 = new Circle2(); //父類里定義了Circle2的對象c2
System.out.println("SuperClass:this is a no parameter constructor");
}
public SuperClass(String chen, String febu) {
name = chen;
birthdate = febu;
System.out.println("this is parameter constructor:" + name + birthdate);
}
public void show() {
System.out.println("this is a public function" + name + birthdate);
}
}
public class SubClass extends SuperClass {
String address;
Circle c = new Circle(); //父類里定義了Circle的對象c
public SubClass() {
System.out.println("SubClass:this is a no parameter constructor");
}
public void personinformation(String _name, String _birth, String _address) {
System.out.println("output information" + _name + _birth + _address);
}
}
public class Circle {
public static final double PI = 3.14;
public Circle() {
System.out.println("Circle:this is a no parameter constructor");
}
}
public class Circle2 {
public static final double PI = 3.14;
private double banjing;
public Circle2() {
System.out.println("Circle2:this is a no parameter constructor");
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass absence = new SubClass();
}
}
運行結果:
Circle2:this is a no parameter constructor
SuperClass:this is a no parameter constructor
Circle:this is a no parameter constructor
SubClass:this is a no parameter constructor
新聞熱點
疑難解答