1.请输入并运行以下代码,得到什么结果?
public class Test1 { public static void main(String[]args){ Foo obj1=new Foo(); Foo obj2=new Foo(); System.out.println(obj1==obj2); } } class Foo { int value=100; }
运行结果:
当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等 当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。 引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同,此代码内两个变量保存的对象地址不同,所以会出现false.
2.以下代码为何无法通过编译?哪儿出错了?
public class Test2 { public static void main(String[]args){ Foo obj1=new Foo(); } } class Foo { int value; public Foo(int initValue) { } value=initValue; }
Foo obj1=new Foo()在此处调用的时候没有参数。
(3)使用上页幻灯片中定义的类,以下代码输出结果是什么?
public class Test2 { public static void main(String[]args){ InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field); obj=new InitializeBlockClass(300); System.out.println(obj.field);} } class InitializeBlockClass{ { field=200; } public int field=100; public InitializeBlockClass(int value){ this.field=value; } public InitializeBlockClass(){ } }
输出结果为:
Java进行初始化的地方有两个,初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块(以上程序为实例初始化块)。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
当有两个构造函数时依据参数个数进行引用
请依据代码的输出结果,自行总结Java字段初始化的规律。
Java进行初始化的地方有两个,初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块(以上程序为实例初始化块)。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。当有两个构造函数时依据参数个数进行引用
4.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。
5.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)? 请编写代码验证你的想法。
public class Test1{ int value1= 2;//实例变量 static int value2= 3;//类的静态变量 public static void print()//静态方法 { System.out.println("实例变量value1 = " + new Test1().value1); //在静态方法中访问类的实例变量需首先进行类的实例化 System.out.println("静态变量value2= " + value2); //在静态方法中可直接访问类的静态变量 } public static void main(String[] args) { Test1 test = new Test1(); Test1.print (); System.out.println("结果是 :实例变量 = " + test.value1);//访问实例成员 } }
从上面代码可知,先new创建一个对象,通过对象去调用成员方法和变量,
6.使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
package Test1; public class Test1{ public static void main(String[]args){ Sum s=new Sum(); Sum s2=new Sum(); Sum s3=new Sum(); } } class Sum{ static int i=0; Sum() {i++; System.out.println("你已经创建了"+i+"个对象");} }
实验结果: