[英]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.