2016-04-24 76 views
-1

我刚从Xamarin/C#切换到Android Studio/Java,并熟悉两种语言之间的差异。我在读java写的一个机器人的书,偶然发现的代码如下两行:两个(简单?)Android/Java语法问题

1)

PreferenceManager.getDefaultSharedPreferences(this) 
    .registerOnSharedPreferenceChangeListener(preferencesChangeListener); 

在第一行,我对preferencesChangeListener如何使用混淆。在C#中,你不能仅仅将一个新的preferencesChangeListener对象抛到一个参数中而不需要实例化对象。所以在Java中,你允许隐式实例化吗?

2)

int screenSize = getResources().getConfiguration().screenLayout & 
    Configuration.SCREENLAYOUT_SIZE_MASK; 

其次,我对这里使用的 '&' 符号混淆。我认为&符号用于布尔参数,但您在这里看到,等号的左边等于一个整数。这里发生了什么?

+1

'preferencesChangeListener'必须在该方法调用时可用的某个范围内声明。在处理数字时,'&'是Java中按位与运算符 – Kon

+0

它看起来像'preferenceChangeListener'是对对象实例的变量引用。有没有事先声明? 'PreferenceChangeListener preferenceChangeListener = new PreferenceChangeListener()'或类似的东西? – gmiley

+2

@Kon你的意思是按位,&&是逻辑AND运算符 – Natecat

回答

2
  1. 不,你不能隐式实例化,如果这个变量未被实例化,你可能会得到一个NullPointerException,除非你调用它的方法是使用它作为一个输出
  2. 在大多数语言,包括java,&&是布尔运算符,&是按位运算符。 &是一个按位与,因此例如(0101) & (1110)将是(0100)。在你的例子中,它被用来清零某些位。