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();
}
}
我不清楚为什么,没有括号,它不起作用,括号的意义是什么?请详细解释。
答案 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。如果您使用其他名称声明变量,则可能是。