子類和父類方法循環調用,棧溢出錯誤分析

1、工作中遇到了一個問題,執行拋出錯誤

這是一個棧溢出的錯誤。

分析代碼,原因是,一個對話框類間接繼承了java.awt.Dialog和java.awt.Component,又自己實現了show()方法,在show方法中調用了super.setVisible(true)。

Component類中setVisible(true)→show(true);→show()

show(true);其實執行的是對話框類的show方法。這樣,對話框的show()→super.setVisible(true)說明:component類的setVisible()方法→show(true);→show()說明:對話的show()方法,造成循環調來調去,沒玩沒了快哭了。所以就發生了棧溢出的錯誤。

 

2、下面是自己寫的一個樣例,大家可以看看。

Parent類

package com.learn;

public class Parent {
 
 public void show() {
  System.out.println("Parent Class's show method");
 }

 public void setVisible(boolean flag) {
  if (flag) {
   show();
  }
  else {
   hide();
  }
 }

 public void hide() {
  System.out.println("Parent Class's hide method");
 }
}

 

Child類:

package com.learn;

public class Child extends Parent{

 @Override
 public void show() {
  System.out.println("Child Class's show method");
  super.setVisible(true);
 }
}

Main類代碼:

  Parent obj = new Child();
  obj.show();

最終執行結果截圖:

 

跟上面的非常類似,我不相信解釋了。

關鍵要理解,Child繼承Parent,如果他自己實現了show()方法,即使在父類中調用show(),其實執行的還是Child類中的show()。多寫幾個例子,慢慢琢磨,是有點難懂。

遇到的次數多了,就慢慢會記住了大笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章