课后作业1:
源代码:
public class NumberObjects {
public static void main(String[] args) {
Number n1=new Number();
Number n2=new Number();
System.out.println("你已经创建了"+Number.count+"对象");
}
}
class Number
{
static int count;
public Number()
{
count++;
}
int GetCount()
{
return count;
}
}
运行结果截图:
*思考1
早期我们经常这样定义变量
int value=100;
前面的示例中这样定义变量
MyClass obj = new MyClass();
这两种方式定义的变量是一样的吗?
不一样。前面只定义一个变量,后者定义的对象变量。
*思考2:
对象变量也可以使用“==”判断两变量值是否相等吗?不相等
请输入并运行以下代码,得到什么结果?
运行结果:flase
原因:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。
*动手动脑:
以下代码为何无法通过编译?哪儿出错了?
构造函数未定义。new Foo()缺少参数
*“自找麻烦”:
如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
如果父类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块。如果类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块将类的成员赋予初值。如果构造函数中年存在this()调用则执行。
*进行试验:
使用上页幻灯片中定义的类,以下代码输出结果是什么?
运行结果:100
300
规律:所有类的变量都默认初始化null,数字类的原始数据类型默认初始化为0。
执行类的成员定义的默认值或类的初始化块,到底执行哪个要看哪一个排在前面。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
*动手动脑:
当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
请自行编写示例代码验证以上结论。
class GrangFather
{
static
{
System.out.println("GrangFather的静态初始化块");
}
}
class Father extends GrangFather
{
static
{
System.out.println("Father的静态初始化块");
}
}
class Son extends Father
{
static
{
System.out.println("Son的静态初始化块");
}
}
public class JiCheng {
public static void main(String[] args) {
new Son();
}
}
*动手动脑:
请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
1.静态初始化块只执行一次。
2.创建子类型的对象时,也会导致父类型的静态初始化块的执行。
一个有趣的问题:
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
*“神器代码”
public static void main(String[]args){
Integer i1=100;
Integer j1=100;
System.out.println(i1==j1); //true
Integer j2=129;
Integer j2=129;
System.out.println(j2==j2); //flase
}
两对整数明明完全一样,为何一个输出true,一个输出false?
调用了java.lang.String类,包含了字符串的值和实现比较特殊,可以不适用构造方法,就可以直接获得一个字符串对象。
*出问题啦!
package jix
public class Hello
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
运行结果:错误:找不到或无法加载主类 jxlPacakge.Hello
*动手练习
不使用Eclipse,直接使用命令行运行Test1.java,Test2.Java,Test3.Java