这个InnerClass概念的工作

时间:2016-04-12 10:07:43

标签: java inner-classes

public class ShadowTest
{

    public int x = 0;

    class FirstLevel
    {
        {  // here not able to understand why it allows.

            x = 1;
        }

        void methodInFirstLevel()
        {
            System.out.println("x = " + x);
            // System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
        }
    }

    public static void main(String... args)
    {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel();
    }
}

我不清楚为什么,没有括号,它不起作用,括号的意义是什么?请详细解释。

3 个答案:

答案 0 :(得分:1)

因为当你删除括号时它被认为是一个声明,你不能再次在内部类中声明@GraphId private Long graphId; //used internally, never assign a value private Long id; //your application id, stored as a property on the entity ,因为外部具有相同名称的变量。

允许在创建实例时被视为初始化块的x原因执行。

答案 1 :(得分:0)

它基本上被认为是那里的构造函数。因为你是java的新手,如果你把它写成

,这对你来说是有意义的
mButtonLogin.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {

            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d("status", "onSuccess");
                AccessToken accessToken = loginResult.getAccessToken();
                Profile profile = Profile.getCurrentProfile();    
                GraphRequest request = GraphRequest.newMeRequest(
                        accessToken,
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(
                                    JSONObject object,
                                    GraphResponse response) {
                                // Application code
                                try {

                                    String name = object.getString("name");
                                    String email =object.getString("email");


                                } catch (JSONException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                        });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "name,email,birthday");
                request.setParameters(parameters);
                request.executeAsync();



            }

            @Override
            public void onCancel() {

                Log.d("status", "onCancel");
            }


            @Override
            public void onError(FacebookException e) {

                Log.d("status", "onError " + e);
            }
        }
        );

检查 http://www.javatpoint.com/constructor

中的构造函数

答案 2 :(得分:0)

如果您将从实例块中删除括号,它将成为声明状态。您已经拥有与外部类成员相同的变量x。如果您使用其他名称声明变量,则可能是。