一)请依据代码:
的输出结果,自行总结Java字段初始化的规律。
源代码:
class InitializeBlockClass
{
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value){
this.field=value;
}
public InitializeBlockClass(){
}
}
public class Test {
public static void main(String[] args)
{
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);
obj=new InitializeBlockClass(300);
System.out.println(obj.field);
}
}
public int field=100;在类初始化后面时:
public int field=100;在类初始化前面时:
通过两个情况对比,很容易发现:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
二)当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。请自行编写示例代码验证以上结论。
源代码:
//验证当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
//范亚雷,2015,10,17
class One //祖父类
{
static
{
System.out.println("祖父类的静态初始化块");
}
{
System.out.println("祖父普通初始化块");
}
}
class Two extends One //父类
{
static
{
System.out.println("父类的静态初始化块");
}
{
System.out.println("父类的普通初始化块");
}
}
class Three extends Two //子类
{
static
{
System.out.println("子类的静态初始化块");
}
{
System.out.println("子类的普通初始化块");
}
}
public class Test2
{
public static void main(String[] args)
{
new Three();
}
}
运行结果:
从运行结果的截图中很容易看出创建子类对象会导致父类初始化块的执行。
三)静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?请编写代码验证你的想法。
源代码:
//静态方法中访问类的实例成员(
//范亚雷 2015.10.17
class Myclass
{
int i=100; //实例变量
static public void output(){
Myclass a=new Myclass(); //关键点
System.out.println(a.i);
}
}
public class Test3 {
public static void main(String[] args){
Myclass g=new Myclass();
g.output();
}
}
运行结果:
运用静态方法访问实例变量,最关键的步骤是在静态变量中新建对象实例,再引用类中实例变量。
四)使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
源代码:
//使用类的静态字段和构造函数跟踪某个类所创建对象的个数。
//范亚雷 2015.10.17
class Myclass
{
int i=0; //计数变量
public Myclass(){
i++;
System.out.println("当前创建的对象个数为"+i);
}
}
public class Test3 {
public static void main(String[] args){
Myclass g=new Myclass();
}
}
运行结果截图:
五)两对整数明明完全一样,为何一个输出true,一个输出false?
整数在小于127时都可以用常量池,因此第一次比较的的地址是取自同一个地址的数字,而第二次比较的数是创建了两个不同地址的对象,所以第一次比较的地址相同,第二次不同。