簡體   English   中英

關於Java中動態類型的問題

[英]Question about dynamic typing in Java

我從berkley cs數據結構網絡廣播得到了這個:

class A {
  void f() {System.out.println("A.f");}
  void g() {f();}
 // static void g(A y) {y.f();}
}

class B extends A {
  void f(){
    System.out.println("B.f");
  }
}

class C {
  static void main (String[] args){
    B aB = new B();
    h (aB);
  }

  static void h (A x) {x.g();}
  //static void h (A x) {A.g(x);}  what if this were h 

}

你能告訴我什么打印出來,為什么? 導師說Bf,但我不明白為什么。 我以為是Af謝謝你(不,我不在課堂上,只是想學習。)

編輯:對於我從視頻講座中復制的錯誤感到抱歉。

此示例演示了面向對象編程的強大功能。

. 因為ab是B的實例,所以對ab的任何方法調用都將使用B中定義的函數,

這個例子是如此抽象,以至於它的優點可能並不清楚。 讓我做一個更現實的例子:

class Employee
{
  ... bunch of stuff ...
  void calcPay()
  {
    pay=hoursWorked*hourlyRate;
  }
  void produceCheck))
  {
    calcPay();
    calcTaxes();
    calcBenefitDeductions();
    printCheck();
  }
}
class Salesman extends Employee
{
  void calcPay()
  {
    pay=sales*commissionRate;
  }
}
... somewhere else ...
for (Employee employee1 : employeeList)
{
  employee1.produceCheck();
}

我遺漏了各種各樣的細節來說明問題:這段代碼無法編譯。

但是重要的是:推銷員有一種不同的方法來計算他們的工資,而不是其他員工:他們是按佣金而不是每小時支付的。 (在現實生活中,我們大概也有受薪員工,但正如我所說,我正在簡化。)計算任何類型員工薪酬的功能都是從一個更大的功能中調用,也可以做其他事情。 面向對象編程的優點在於我們可以調用外部函數,而不關心我們調用它的對象是普通的Employee還是Salesman。 每個對象都知道它是什么,並調用正確的函數。 在示例的最后幾行中,我們有一些包含常規Employees和Salesmen的結構,我們可以遍歷並處理它們而無需檢查它們的類型。 沒有OOP,我們必須經常編寫如下代碼:“if(type == SALESMAN)... else if(type == HOURLY)......”

打印“Bf”的原因是因為方法的實現是由對象的運行時類型決定的,而不是它的編譯時類型。 它就像C ++中的virtual關鍵字。

一旦你構造了B ,你知道調用它的f方法將打印“Bf”,即使B被稱為A

此外,你的Af方法缺少一個近距離支撐。

該代碼不正確,Ag()不接受任何參數。

static void h (A x) {A.g(x);}

的Ag(X); 試圖在A上調用一個靜態方法,用x作為參數。 您發布的代碼示例無法實現這一點。

除了錯誤的代碼之外,原因是B用自己的實現覆蓋方法f()。 因此B的任何實例,例如B x = new B(); 將調用B定義的不是Af()的f()。 到達Af()的唯一方法是通過調用super.f()來自B的實例內部;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM