我了解到在类中你可以声明变量和方法。如果首选,它们都可以声明为静态。
现在我遇到了一个我不太懂的程序示例。在类中的一些变量声明之后,有一个声明为static的字段,里面有程序代码。
这段代码什么时候执行?我的猜测是,在创建新对象时,代码执行如下:
如果我执行
MyCars myCars = new MyCars();
以下将按此顺序发生?
public class MyCars { private Car volvo = new Car() // (1) (2) static { volvo.setNumberOfWheels = 4; // (3) } public MyCars() { volvo.setBrand = "Volvo"; volvo.setModel = "XC70"; (4) }
以下是原始代码:
public class SettingsSetter extends ListActivity { private static Map<Integer,String> menuActivities=new HashMap<Integer,String>(); private static List<BooleanSetting> settings=new ArrayList<BooleanSetting>(); static { menuActivities.put(R.id.app, Settings.ACTION_APPLICATION_SETTINGS); menuActivities.put(R.id.security, Settings.ACTION_SECURITY_SETTINGS); menuActivities.put(R.id.wireless, Settings.ACTION_WIRELESS_SETTINGS); menuActivities.put(R.id.all, Settings.ACTION_SETTINGS); settings.add(new BooleanSetting(Settings.System.INSTALL_NON_MARKET_APPS, "Allow non-Market app installs", true)); settings.add(new BooleanSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, "Use haptic feedback", false)); settings.add(new BooleanSetting(Settings.System.ACCELEROMETER_ROTATION, "Rotate based on accelerometer", false)); }
答案 0 :(得分:5)
静态初始化程序在加载类时执行,因此在创建任何实例之前。您的第一个代码出错,因为volvo
是一个实例(非静态)变量,静态块无法访问它。重温你的例子:
public class MyCars
{
private static Car audi = new Car()
// (2)
private Car volvo = new Car()
// (5) (6)
static
{
audi.setNumberOfWheels = 4;
// (3)
}
public MyCars()
{
volvo.setBrand = "Volvo";
volvo.setModel = "XC70";
// (7)
}
}
MyCars myCars = new MyCars();
// (1) (4)
答案 1 :(得分:0)
这不是一个字段,它是一个静态初始化器。首次加载类时,它将执行一次。当初始化类的实例时, not 将被执行。
顺便说一句,您的MyCars
代码将无法编译,因为静态初始化程序无法引用实例变量,因为它将在该类的任何实例之前执行。
答案 2 :(得分:0)
它是一个静态块,或者是一个静态初始化块,在将类加载到JVM中时执行。无论你有什么,它都会在加载时自动执行。
同一个类中也可以有多个静态块,JVM可以按照它们出现的顺序执行它们。