1.早期我们经常这样定义变量 int value=100; 前面的示例中这样定义变量 MyClass obj = new MyClass(); 这两种方式定义的变量是一样的吗?
不一样,当声明一个对象类型的变量时,实际上并没有创建一个对象,此变量=null。,但定义了int i=100,电脑就会马上分配内存空间,引用对象后的对象变量,如果不再使用此变量,JVM会回收MyClass对象所占用的内存(垃圾回收)。
2.对象变量也可以使用“==”判断两变量值是否相等吗?
package ketang; public class Text { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Foo obj1=new Foo(); Foo obj2=new Foo(); System.out.println(obj1==obj2); } } class Foo{ int value=100; }
运行结果
原因
当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等。
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。
3.重写基类的equals方法?
4.以下代码为何无法通过编译?哪儿出错了?
package ketang; public class Text { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Foo obj1=new Foo(); } } class Foo{ int value; public foo(int initvalue){ value=initvalue; } }
在旁边显示的错误为没有返回值类型,类当中已经有了构造函数将不会自动调用默认的构造函数,即错在没有参数。
5.如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
运行结果
构造函数函数名和类名一样,会被自动调用。如果没有定义,系统会分配一个没有参数的构造函数。(初始化,没有返回值)的构造函数。
构造函数是该类中最先被用到的函数,他是第一的地位,所以先显示的构造函数,后显示的赋值。
规律:
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
执行类的构造函数。
6.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
运行结果
静态变量在类创立时就分配一个内存空间,可以直接通过类名(对象名也可以!!!!写出例子)进行使用。但静态变量就只有一个内存空间,无论静态变量使用多少次,它都只有一个内存,相当于数据不断覆盖。
*而实例变量是在类创立后并且对象实例化之后才会分配内存空间,只能通过对象进行使用,并且有多少个对象就会有多少个内存。
所以在实例变量int y; public int getY(){return y;} 没有对象实例化时,是不能进行使用的,并且他也不能通过类名StaticDemo.getY()进行使用。这就是语法错误咯~然后就是静态变量为进行初始化的默认值:int类型是0,bool类型是false,对象是null。
7.上述神奇代码(StrangeIntegerBehavior.java)输出诡异的结果,原因何在?
实验结果
原因
Integer=100; 实际上调用的是Integer.valueOf(int i);
因为从-127到128之间的Integer数,Java在Integer中有事先缓存好的原型对象,每次返回的都是同一个Integer对象,只有不在这个范围的数才会新创建出一个Integer,最后所指都不是同一个对象,所以比较的不是同一个对象。
129不能判断。