课堂作业及 动手动脑问题整理
课堂作业一
使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
程序:
package com;
public class Duixiang {
public static void main(String[] args){
duixiang a=new duixiang();
a.out();
duixiang b=new duixiang();
b.out();
}
}
class duixiang{
static int n=0;
duixiang(){
n++;
}
public void out(){
System.out.println("你已经创建了"+n+"个对象!");
}
}
结果截图:
课堂问题整理
一、进行试验:
运行结果:100 300
Java字段初始化的规律:所有类的变量都默认初始化为null,数字类的原始数据类型默认初始化为0,boolean默认初始化为false;进行初始化的地方有初始化块和构造函数,初始化快分为静态初始化块和实例初始化块。执行类成员定义时指定的默认值或类的初始化块,到底执行哪个要看哪个“排在前面”。
二、动手动脑:
当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
请自行编写示例代码验证以上结论。
程序:
package com;
public class Animal {
public boolean live=true;
public String skin="";
public void eat(){
System.out.println("动物需要吃食物");
}
public void move(){
System.out.println("动物会运动");
}
}
class Bird extends Animal{
public String skin="羽毛";
public void move(){
System.out.println("鸟会飞");
}
}
class Zoo{
public static void main(String[] args){
Bird bird=new Bird();
bird.eat();
bird.move();
System.out.println("鸟有:"+bird.skin);
}
}
截图:
三、动手动脑:
请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
结果截图:
静态初始化块的执行顺序:
1、静态初始化块只执行一次。
2、创建子类型的对象时,也会导致父类型的静态初始化块的执行。
四、一个有趣的问题:
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
请编写代码验证你的想法。
程序:
package com;
public class ButtonFactory {
private static ButtonFactory _instance=null;
public static ButtonFactory getInstance(){
if(null==_instance)
_instance=new ButtonFactory();
return _instance;
}
}