如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
运行结果。
根据我的总结,它们三个的优先级是:构造方法 > 字段初始值 > 初始化块。
当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
public class InitializeBlockDemo
{
/**
* @param args
*/
public static void main(String[] args)
{
InitializeBlockClassSon obj=new InitializeBlockClassSon();
System.out.println(obj.field);
obj=new InitializeBlockClassSon(300);
System.out.println(obj.field);
}
}
class InitializeBlockClass
{
{
field = 200;
}
public int field;
public InitializeBlockClass(int value)
{
this.field = value;
}
public InitializeBlockClass()
{
}
}
class InitializeBlockClassSon extends InitializeBlockClass
{
public int field1 = 1000;
public InitializeBlockClassSon(int value)
{
this.field1 = value;
}
public InitializeBlockClassSon()
{
}
}
运行结果。
由结果可知,定义的子类不管对其赋不赋值,得到的结果都是父类初始化块的值(前提是父类中没有字段初始值)。
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员
class StaticDemo
{
static int x = 1;
int y = 2;
static public void display(int flag)
{
System.out.println(x + flag);
}
public int getY()
{
return y;
}
}
public class ShowStatic
{
public static void main(String[] args)
{
StaticDemo a = new StaticDemo();
int flag = a.getY();
StaticDemo.display(flag);
}
}
因为静态方法在对象初始化的时候就已经被调用,所以直接访问实例变量的时候实例变量还不存在而发生错误。避免的方法是在main函数中定义一个局部变量获取实例变量的值,然后在静态方法中调用局部变量。
但这只做到了如何在静态方法中访问类的实例成员数据,而不是如何在静态方法中访问类的实例成员。
请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?。
class Student
{
static int number = 0;
String name;
public Student()
{
number++;
}
public Student(String n)
{
name = n;
number++;
}
public void showNumber()
{
System.out.println("你已经创建了" + number + "对象。");
}
}
public class ShowNumber
{
public static void main(String[] args)
{
Student a = new Student("ycx");
a.showNumber();
}
}