类与对象的作业
(1)请依据代码的输出结果,自行总结Java字段初始化的规律
源代码:public class InitializeBlockDemo {
/**
* @param args
*/
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字段的初始值
//public int field=100;
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value){
this.field=value;
}
public InitializeBlockClass(){
}
}
实验截图:
规律:java字段的初始化分为静态初始化和实例的初始化,而静态的初始化就是我们所看到的static所修饰的地方。实例的初始化则没有一些关键字了。
(2)请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
源代码:
class Root
{
static{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root()
{
System.out.println("Root的无参数的构造器");
}
}
class Mid extends Root
{
static{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid()
{
System.out.println("Mid的无参数的构造器");
}
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid
{
static{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf()
{
//通过super调用父类中有一个字符串参数的构造器
super("Java初始化顺序演示");
System.out.println("执行Leaf的构造器");
}
}
public class TestStaticInitializeBlock
{
public static void main(String[] args)
{
new Leaf();
}
}
实验截图
规律:首先执行父类中的静态初始化块,然后接着去执行子类中的静态初始化块。
(3)静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员
源代码:
import javax.swing.JOptionPane;
public class Test
{
static int s;
int total_employees=0;
public static void display()
{
System.out.println("工人的总数为:"+s);
}
public int input()
{
String str=JOptionPane.showInputDialog("输入工人的总数:");
total_employees=Integer.parseInt(str);;
return total_employees;
}
public static void main(String args[])
{
Test t = new Test();
s = t.input();
t.display();
}
}
结论:在静态方法中访问类的实例成员:需要创建对象,再通过对象进行调用成员函数访问实例成员
(4)使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
源代码:
public class Test {
static long count=0;
static ThreadLocal Th=new ThreadLocal();
public Test() {
count++;
Th.set(count);
}
public long getCount(){
return (Long)Th.get();
}
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
Test t=new Test();
System.out.println("一共创建了多少个对象");
System.out.println(t.getCount());
}
}
}
实验截图: