03 类与对象 课后作业2
【验证1】:
ClassAndObjectTest.java:
实验截图:
【验证2】:
Demo: ObjectEquals.java:
实验截图:
【验证3】:
TestStaticInitializeBlock.java:
实验截图:
【动手动脑1】:
以下代码为何无法通过编译?哪儿出错了?
结论:
系统默认的是引用Foo类,而不是Foo方法
如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
【自找麻烦】
如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
执行类的构造函数。
类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
【动手动脑2】:
请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
静态初始化块的执行顺序:
1、静态初始化块只执行一次。
2、创建子类型的对象时,也会导致父类型的静态初始化块的执行。
【一个有趣的问题】:
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
请编写代码验证你的想法。
想法:在静态方法中,创建类的一个对象,通过对象调用没有附加static关键字的字段或方法
代码:
import java.util.Scanner;
public class VisitUnstatic
{
private int x=0,y=0;
Scanner input=new Scanner(System.in);
public void setNumber()
{
x=input.nextInt();
y=input.nextInt();
}
public static void getNumber(int a,int b)
{
VisitUnstatic obj=new VisitUnstatic();
obj.setNumber();
a=obj.x;
b=obj.y;
System.out.println(a);
System.out.println(b);
}
public static void main(String[] args)
{
int c=0;int d=0;
VisitUnstatic p1=new VisitUnstatic();
p1.getNumber(c, d);
}
}
【Integer的“诡异”特性”】:
StrangeIntegerBehavior.java:
测试结果:
提示:
使用javap来分析生成class文件,看它调用了Interger类的哪个方法,然后打开JDK源文件查看源码,就可以找到答案。
调用了Integer.valieOf方法;因为从-127到128之间的Integer数,Java在Integer中有事先缓存好的原型对象,每次返回的都是同一个Integer对象,只有不在这个范围的数才会新创建出一个Integer,最后所指都不是同一个对象,所以比较的不是同一个对象。