之前學習沒有注意到這個小問題,有一次到java貼吧逛時看到有關成員變量隐藏的問題,發現自己對此的了解是有的偏差的。寫下此文進行總結。
1.成員變量的隐藏
package 測試;
public class DemoClass {
public static void main(String[] args)
{
A a=new A();
a.printOut(); //1
B b=new B();
b.printOut(); //0
b.show();
a=b;
a.printOut(); //0
}
}
class A
{
private int i=;
public void doAdd()
{
i++;
System.out.println("fu.A");
}
public void printOut()
{
this.doAdd();
System.out.println(this.i);
}
}
class B extends A
{
public int i=;
public void doAdd()
{
i=i+;
System.out.println("zi.B");
}
void show()
{
System.out.println(i);
}
}
分析:第一個輸出不用說了,自然輸出1;
第二個輸出中b對象調用printOut()方法時自然隻能調用父類的方法;裡面這句this.doAdd()調用的是父類的函數,還是子類的呢?之前我記住的是:子類繼承的方法隻能操作子類繼承和隐藏的成員變量;是以我剛剛開始覺得是父類,的是結果是子類的doAdd函數;原因很簡單:就是上面那就話我了解是錯誤的。他的意思其實是說“父類中獨有的方法隻能調用父類的成員變量”注意是成員變量!不包括成員方法,也就是說父類中繼承下來的方法也是可以調用子類中重寫方法的。printOut()中輸出this.i時就隻能調用父類中隐藏的成員,是以輸出的i是父類的i,即還是初始值:0;
第三個也是一樣的意思!
附上運作結果:
2,方法重寫。
下面有一段代碼!
class C
{
int i=;
folat add( folat a, folat b)
{
return a+b;
}
}
class D
{
folat add( folat a, folat b)
{
return a*b;
}
}
這個就是方法重寫,重寫的作用很多 ,主要用在多态和統一代碼。
注意二點就是:
(1)重寫是函數原型是一樣的(java中其實沒有函數聲明這個概念);
假如上面 D中的add()函數是這樣寫的:double add(float a,floatb) 那麼D類的對象調用這個方法時就會發生文法錯誤。
原因是:D中的Add()函數此時既不是overload (overload錯誤)也不是override。導緻對象不知道要調用那個方法。
(2) 子類中重寫方法的通路權限一定不能小于父類中被重寫的方法的通路權限(一般初學者容易出錯)。