<s id="2e0qm"><div id="2e0qm"></div></s>
<div id="2e0qm"><button id="2e0qm"></button></div>
<small id="2e0qm"></small>
<div id="2e0qm"></div>
<div id="2e0qm"><s id="2e0qm"></s></div>
<div id="2e0qm"><button id="2e0qm"></button></div>
主頁 > 知識庫 > 網絡編程 > JSP/Java >

JAVA重載(overload)和覆蓋(override)中的陷阱

來源:中國IT實驗室 作者:佚名 發表于:2013-07-23 17:39  點擊:
大家都知道重載是指在同一個類中,定義了有相同名稱但是有不同參數類型的方法時,到底調用那一個方法會根據參數類型來選擇.我們來看下面這個例子: class ParentClass { } class ChildClass extends ParentClass{ } public class Test { public void testOve
 大家都知道重載是指在同一個類中,定義了有相同名稱但是有不同參數類型的方法時,到底調用那一個方法會根據參數類型來選擇.我們來看下面這個例子:  class ParentClass {
  }
  class ChildClass extends ParentClass{
  }
  public class Test {
  public void testOverLoad(ParentClass cls){
  System.out.println("It's ParentClass");
  }
  public void testOverLoad(ChildClass cls){
  System.out.println("It's ChildClass");
  }
  public static void main(String[] args) {
  Test test = new Test();
  ParentClass parentCls = new ParentClass();
  ParentClass childCls = new ChildClass();
  test.testOverLoad(parentCls);
  test.testOverLoad(childCls);
  }
  }
  大家想想輸出的結果應該是什么呢,答案是:
  It's ParentClass
  It's ParentClass
  原因是決定方法重載是在編譯的時候發生,而不是在運行的時候.
  覆蓋是指在父類和子類有相同名稱參數的方法,子類的方法覆蓋父類的方法.來看下面的例子
  public class ParentClass {
  public String str1 = "Parent1";
  public String str2 = "";
  public  ParentClass(){
  str2="Parent2";
  }
  public void func(){
  System.out.println("ParentClass.func");
  }
  public String getStr2() {
  return str2;
  }
  }
  public class ChildClass extends ParentClass{
  public String str1 = "Child1";
  public String str2 = "";
  public  ChildClass(){
  str2="Child2";
  }
  public void func(){
  System.out.println("ChildClass.func");
  }
  public String getStr2() {
  return str2;
  }
  }
  public class Test
  public static void main(String[] args) {
  ParentClass childCls = new ChildClass();
  System.out.println(childCls.str1);
  System.out.println(childCls.str2);
  System.out.println(childCls.getStr2());
  childCls.func();
  }
  }
  輸出的結果應該是什么呢,答案是:
  Parent1
  Parent2
  Child2
  ChildClass.func
  原因是對于方法的覆蓋發生在運行時,所以子類的方法被調用.而對于變量的覆蓋是在編譯的時候決定的,childCls在編譯的時候類型是 ParentClass,所以對變量的直接訪問得到的是ParentClass中定義的值.對于成員變量,編譯器會對父類和子類的所有成員變量都保存一份 拷貝,所以這才有了方法的多態,并沒有變量的多態。

    有幫助
    (0)
    0%
    沒幫助
    (0)
    0%
    真人女荫道口100种图片
    <s id="2e0qm"><div id="2e0qm"></div></s>
    <div id="2e0qm"><button id="2e0qm"></button></div>
    <small id="2e0qm"></small>
    <div id="2e0qm"></div>
    <div id="2e0qm"><s id="2e0qm"></s></div>
    <div id="2e0qm"><button id="2e0qm"></button></div>