Public class Tese{ pulic static voif main(String[] args){ Foo obj1=new Foo(); } class Foo{ int value; public Foo(int initValue){ value=initValue; } } }
以上代码在编译时会出现错误,原因是因为如果类提供了一个自定义的构造方法,将导致系统不再提高默认构造方法。而对于多构造函数,
同一个类可以有多个构造函数,多个构造函数之间通过参数来区分。这是方法重载的一个实例。构造函数之间可以相互调用。
class Fruit{ int grams; int calsPerGram; Fruit(){ this(55,10); } Fruit(int g, int c){ grams=g; calsPerGram=C; } }
而当一个类中如果既有初始化块又有构造方法,同时还设定了字段的初始值时,编译应该听谁的?
类字段的初始化顺序:
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。·执行类的构造函数。
类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
class MyClass {
private int number; // 实例字段
public static void main(String[] args) {
MyClass myObject = new MyClass();
myObject.setNumber(10); // 通过实例调用静态方法
System.out.println(myObject.getNumber()); // 通过实例调用非静态方法
}
public static void setNumber(MyClass instance, int value) {
instance.number = value; // 访问实例字段
}
public int getNumber() {
return number; // 返回实例字段的值
}
}
在上面的例子中,通过将实例作为参数传递给静态方法setNumber
,我们可以在静态方法中访问类的实例成员number
。然后,通过实例调用非静态方法getNumber
来获取实例字段的值。