① java的繼承中的構造方法
java繼承中對構造函數是不繼承的,只是調用(隱式或顯式)。
舉例說明:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
編譯後執行結果如下:
分析:SonClass s = new SonClass(66);
執行這句時,調用
public SonClass(int c) {
System.out.println(1234);//系統會自動先調用父類的無參構造函數(super())
}
在這個構造函數中,等價於
public SonClass(int c) {
super();//必須是第1行,否則不能編譯
System.out.println(1234);
}
所以結果是 100 1234
在創建子類的對象時,Java虛擬機首先執行父類的構造方法,然後再執行子類的構造方法。在多級繼承的情況下,將從繼承樹的最上層的父類開始,依次執行各個類的構造方法,這可以保證子類對象從所有直接或間接父類中繼承的實例變數都被正確地初始化。
3.如果子類構造函數是這樣寫的
public SonClass(int c) {
super(22);//必須是第1行,否則不能編譯
//顯式調用了super後,系統就不再調用無參的super()了;
System.out.println(1234);
}
執行結果是 22
1234
總結1:構造函數不能繼承,只是調用而已。
如果父類沒有無參構造函數
創建子類時,不能編譯,除非在構造函數代碼體中第一行,必須是第一行顯式調用父類有參構造函數
如下:
SonClass (){
super(777);//顯示調用父類有參構造函數
System.out.println(66);
}
如果不顯示調用父類有參構造函數,系統會默認調用父類無參構造函數super();
但是父類中沒有無參構造函數,那它不是不能調用了。所以編譯就無法通過了。
總結2:創建有參構造函數後,系統就不再有默認無參構造函數。
如果沒有任何構造函數,系統會默認有一個無參構造函數。
② Java中子類不能繼承父類的構造方法應如何理解
首先,你這句話沒有說清楚構造函數(一般我們講的「函數」就是「方法」)是默認的無參數,還是自己手動寫的有參數的。
一個類可以定義多個 構造函數,如果在定義類時你手動寫了一個有參數的構造函數,那麼當前類只有這一個有參數的構造函數。如果在定義類時沒有定義構造函數,則編譯系統會自動插入一個無參數的默認構造函數,這個構造函數不執行任何代碼,且不會顯示出來。
Java中,子類只能繼承父類的用protected 和 public修飾的構造函數。其中,無參構造函數只能是 public。另外:對super的調用必須是構造器中的第一個語句
③ Java中子類的構造方法調用父類構造方法的問題
不妨給你個例子程序,更能說明問題。下面是正方形類繼承矩形類
interface EqualDiagonal{
public double getDiagonal();
}
class Rectangle implements EqualDiagonal{
double a , b;
Rectangle(){}
//如果父類中沒有無參的構造方法,編譯出錯
Rectangle (double x,double y){
this.a = x;
this.b = y;
}
public double getDiagonal(){
return Math.sqrt(a * a + b *b);
}
}
class Square extends Rectangle implements EqualDiagonal{
double a;
Square (double x){
super();//子類在構造的過程中必須調用其父類的構造方法
//這句話可寫可不寫,因為
//如果子類的構造方法中沒有顯示調用父類構造方法,則編譯器默認調用父類無參數的構造方法
this.a = x;
}
public double getDiagonal(){
return Math.sqrt(2.0 * a *a);
}
}
class TestSquare{
public static void main(String []args){
Rectangle r = new Rectangle(3.0,4.0);
Square s = new Square (1.0);
System.out.println(r.getDiagonal());
System.out.println(s.getDiagonal());
}
}
打字不易,如滿意,望採納。
④ java子類可以繼承父類的構造方法嗎
一,java子類不能繼承父類的構造方法(可以調用,但不是繼承):
1、構造方法的定義是與類的名稱相同:如果子類能夠繼承父類的構造方法,那麼在子類的構造方法中就有不同於子類名稱的構造法;
2、這與構造方法的定義不符,因此子類是不能繼承父類的構造方法的;
3、以上參考資料來源:http://bbs.csdn.net/topics/360118234
二,子類繼承父類時,需要注意以下三點:
1、在子類繼承父類的時候,子類必須調用父類的構造函數;
2、在父類有默認構造函數,子類實例化時自動調用,在父類沒有默認構造函數,即無形參構造函數,子類構造函數必須通過super調用父類的構造函數;
3、在java的繼承當中子類是不可以繼承父類的構造函數,只能調用父類的構造函數。
⑤ java中子類能不能繼承父類構造方法
子類可以繼承父類的構造方法,並遵循以下原則: 1、子類無條件的繼承父類的無參構造方法。 2、子類自身沒有定義構造方法,繼承父類的無參構造方法,作為構造方法;子類自身定義了無參構造方法。
⑥ java繼承中,父類的構造方法問題
子類也寫一個構造方法 在方法里調用super(參數,參數...)就可以調用父類的構造方法了
⑦ java中,子類能不能繼承父類的構造方法
你老師是對的,不過一下子說不清楚。給你個例子。
class A{
public A(){} // 1:無參數構造方法。
public A(String s){} // 2.
}
class B extends A{
public B(String s){
super(s); // 3.
}
}
說明:如果沒有1處的無參數構造方法,那麼3處一定要主動調用父類帶參數的構造方法。
如果有1處的構造方法,那麼3處代碼可以不要,因為Java會自動默認調用父類的無參數構造方法。
記住一點:在構造子類時,一定會調用到父類的構造方法。
所以父類要麼有一個默認的無參數構造,這樣Java會自動調用這個無參數的構造。如果父類沒有無參數的構造,那麼就要你自己在子類的構造中,通過super()的方式調用父類的構造。
⑧ 高人指點一下java父類構造方法
Weapon類沒有無參構造方法,Tank類不能隱式調用Weapon類的無參構造方法,因此不能使用隱式構造方法,必須顯式定義Tank類的構造方法,並在Tank類的構造方法第一行調用父類的構造方法super(int, int)。
⑨ java調用父類的構造方法,並傳遞參數怎樣實現
class Dad
{
String name;
int age;
public Dad(){}
public Dad(String name,int age)
{
this.name =name;
this.age =age;
}
}
class kid extends Dad
{
public kid()
{
super(); //父類構造器的調用,必須是子類構造器中的第一個語句
System.out.println("優先調用了無參構造器 ");
}
public kid(String name,int age) //含參構造器中的參數列表,即包含了子類的成員變數,也包含了繼承的父類的成員變數
{
super(name,age); //●●●父類構造器的調用,必須是子類構造器中的第一個語句
System.out.println("優先調用了含參構造器:"+this.name+"已經"+this.age);
}
}
public class maintest
{
public static void main(String[] args)
{
kid kd1=new kid();
kid kd2=new kid("帥哥",19);
}
}
⑩ 關於java中子類繼承父類的構造方法
java繼承中對構造函數是不繼承的,只是調用(隱式或顯式)。
舉例說明:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
編譯後執行結果如下:
分析:SonClass s = new SonClass(66);執行這句時,調用
public SonClass(int c) {
System.out.println(1234);//系統會自動先調用父類的無參構造函數(super())
}
在這個構造函數中,等價於
public SonClass(int c) {
super();//必須是第1行,否則不能編譯
System.out.println(1234);
}
所以結果是 100 1234
3.如果子類構造函數是這樣寫的
public SonClass(int c) {
super(22);//必須是第1行,否則不能編譯
//顯式調用了super後,系統就不再調用無參的super()了;
System.out.println(1234);
}
執行結果是 22
1234
總結1:構造函數不能繼承,只是調用而已。
如果父類沒有無參構造函數
創建子類時,不能編譯,除非在構造函數代碼體中第一行,必須是第一行顯式調用父類有參構造函數
如下:
SonClass (){
super(777);//顯示調用父類有參構造函數
System.out.println(66);
}
如果不顯示調用父類有參構造函數,系統會默認調用父類無參構造函數super();
但是父類中沒有無參構造函數,那它不是不能調用了。所以編譯就無法通過了。
總結2:創建有參構造函數後,系統就不再有默認無參構造函數。
如果沒有任何構造函數,系統會默認有一個無參構造函數。