2014-05-25 35 views
-6

我有這個驚人的,好看的類:不能referr我get方法

public class SayingsHolder extends Application{ 

    ArrayList<String> SayingsList = new ArrayList<String>(){{ 
     SayingsList.add("1"); 
     SayingsList.add("2"); 

    }}; 

    public ArrayList<String> getSayingsList() { 
     return SayingsList; 
    } 
} 

現在我試圖調用內部的getSayingsList方法我的活動通過的FragmentStatePagerAdapter

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
    final SayingsHolder holder = (SayingsHolder).getApplication(); 
} 

樣樣精現在,但是當我做我這樣的代碼:

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     final SayingsHolder holder = (SayingsHolder).getApplication(); 
     holder.getSayingsList(); 
    } 

它說:

Syntax error on token "getSayingsList", Identifier expected after this token 

問題是holder根本不起作用。我的意思是,當我輸入這個holder.getSayingsList根本沒有顯示。

我在這裏錯過了什麼?我知道這是一個非常小的問題,但似乎我無法發現它。我的活動extends FragmentActivity如果它很重要

看來我在這裏錯過了一些東西。我無法在我的活動中撥打我的方法任何地方。我開始賞金,因爲我需要一個例子。

+1

'我開始賞金,因爲我需要一個example.'我想你需要一個Java底漆。 – Vikram

回答

4

一個簡單的答案是「在課堂上不允許聲明」。對於你的程序最簡單的修復就是創建一個實例列表變量。

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
    final SayingsHolder holder = (SayingsHolder).getApplication(); 
    ArrayList<String> sayingsList = holder.getSayingsList(); 
} 

這只是一個選項。您也可以將此holder.getSayingsList();移動到方法主體或靜態塊。 像所有其他答案一樣,與您編程的問題是語法錯誤。

根據Java語法,一個類的主體可以有成員聲明,​​靜態塊,方法聲明,另一個類聲明,構造函數等。你可以在http://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html上看到這個。這可能會令人困惑,所以請先參考http://docs.oracle.com/javase/specs/jls/se7/html/jls-2.html。這給出了關於每個符號的想法。

public class ScreenSlidePagerAdapter { 
    // This is a member declaration. So "holder" is now a class member. 
    final SayingsHolder holder = (SayingsHolder).getApplication(); 

    // This is a constructor 
    public ScreenSlidePagerAdapter(){ 
    } 

    // An inner class 
    class InnerScreenSlidePagerAdapter{ 
    } 

    // A method 
    public void aMethod() { 
    } 

    // This is a static block 
    static { 
    } 

} 

所有這些都適用於課堂內部使用。但在你的情況下,你正試圖給一個類體添加一個語句。這不是按照語法規則

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {  
    final SayingsHolder holder = (SayingsHolder).getApplication(); //This line a member declaration. And a valid sysntax. So no issues here 

    holder.getSayingsList(); // This is a statement. So this line creates issue as its not part of a class body. 
       // Statements should be enclosed within a method body or static block or for an assigment. 

    //But instead if you say it like 
    List<String> sayingsList = holder.getSayingsList(); // Now it became a filed(member) declaration. You are trying to declare a member names "sayingsList" just like you created "holder" above 
    //So now we converted the statement to a member declaration 
} 

希望這有助於

+0

看來,我錯過了這些規則。這正是我所期待的。非常感謝幫助我。我值得反對票。 – chility

+1

樂意幫忙.. :) –

2

在類的定義中,可以有方法和屬性。 「holder.getSayingsList();」是屬於某個方法內部的聲明。它不能獨立於一個階級的定義。

下面是一個例子:

public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
    final SayingsHolder holder = SayingsHolder.getApplication(); 

    /* You cannot use holder here. Statements like this must be inside a method. 
    holder.getSayingsList(); 
    */ 

    /* For the same reason, you cannot do this here: 
    System.out.println("Hello World!"); 
    */ 

    /* You CAN use holder in an instance method */ 
    public void foo() { 
     holder.getSayingsList(); 
    } 

    /* You can use it in a class method, but you must instantiate a ScreenSlidePagerAdapter object first */ 
    public static void main(String[] args) { 

     ScreenSlidePagerAdapter obj = new ScreenSlidePagerAdapter(); 
     obj.getHolder().getSayingsList(); 

     /* you can do this too */ 
     obj.foo(); 

    } 

    //getter for the holder variable 
    public SayingsHolder getHolder() { 
     return holder; 
    } 

} 
+0

我無法得到它。無論如何感謝您的幫助 – chility

2

你不能說不是一種方法之外的聲明語句。 「holder.getSayingsList();」語句必須位於方法或靜態初始化塊中。