课后作业

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不能判断。

原文地址:https://www.cnblogs.com/z245894546/p/7696360.html