2013-03-27 58 views
2

我有一個abstract class具有可變像如下:Java訪問摘要實例變量

public abstract class MyAbstractClass { 

    int myVariable = 1; 

    protected abstract void FunctionThatUsesMyVariable(); 
} 

然後,當我通過下面的代碼實例化了我classmyVariable不能看出:

MyAbstractClass myClass = new MyAbstractClass() { 

    @Override 
    protected void FunctionThatUsesMyVariable() { 
     // TODO Auto-generated method stub 
    } 
}; 

我做錯了什麼,我該如何實現我想要實現的目標?

回答

7

具有包訪問,你的2類駐留在不同的軟件包你正在申報myVariable。因此該變量對繼承類不可見。你可以用protected訪問聲明它是可見的或將2類在同一個包。

public abstract class MyAbstractClass { 

    protected int myVariable = 1; 

    protected abstract void FunctionThatUsesMyVariable(); 
} 
+0

只有當這兩個類位於不同的包中時,這纔是真實的。 – OldCurmudgeon 2013-03-27 10:50:44

+0

當然,更新了答案。謝謝。 – dcernahoschi 2013-03-27 10:52:03

+0

謝謝,你的回答是正確的。還有一個問題。 'myVariable'是'File',現在抱怨'局部變量可能尚未initialized'但構造函數初始化呢?如果我在普通班上做了這個,它不會抱怨,爲什麼在這裏? – 2013-03-27 12:45:29

1

聲明你的變量作爲保護。它默認爲package-private

+1

-1 - 不是 - 它的'package' – OldCurmudgeon 2013-03-27 10:46:48

+0

這裏是參考http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html – serans 2013-03-27 10:49:47

+0

是的,對不起。你是對的。編輯我的回覆以糾正我的錯誤。 – neutrino 2013-03-27 10:50:20

1

因爲你仍然繼承/擴展抽象類,除非你把它保護現場不被繼承。

2

似乎爲我工作:

public class Test { 
    public static abstract class MyAbstractClass { 
    int myVariable = 1; 
    protected abstract void FunctionThatUsesMyVariable(); 
    } 

    public void test() { 
    MyAbstractClass myClass = new MyAbstractClass() { 
     @Override 
     protected void FunctionThatUsesMyVariable() { 
     myVariable = 2; 
     } 
    }; 
    } 

    public static void main(String args[]) { 
    new Test().test(); 
    } 
} 

我懷疑你正在申報不同包中的兩個類。如果這是你想要的東西,那麼你應該把這些變量protected(或public如果你必須)。另外 - 顯然 - 把它們放在同一個包裏。

+0

+1正確...... – dcernahoschi 2013-03-27 10:57:00