一、使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”
程序设计思想:在构造函数中设一个静态变量来保存创建次数,这样在调用创建构造函数时,变量的值就会增一,最后返回静态变量值即创建次数。
源代码:
package com;
public class Count {
private static int i=0;
public Count(){ //使用静态变量保存创建次数
i++;
}
public static int getNumber(){ //返回个数
return i;
}
public static void main(String[] args){
Count c1=new Count(); //创建对象
Count c2=new Count(); //创建对象
Count c3=new Count(); //创建对象
Count c4=new Count(); //创建对象
System.out.println("一共创建了"+Count.getNumber()+"个对象.");
}
}
结果截图:
二、动手动脑
1、请输入并运行以下代码,得到什么结果?
答:false
当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。
1、以下代码为何无法通过编译?哪儿出错了?
答:类提供了一个自定义的构造方法,这时将导致系统不再提供默认构造方式。
3、(1)使用上页幻灯片中定义的类,以下代码输出结果是什么?
(2)请依据代码的输出结果,自行总结Java字段初始化的规律。
答:JAVA进行初始化的地方有两个:初始化块和构造函数其中初始化块又分为静态初始化块和实例初始化块。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。
如果在主函数中创建对象没有形参时,如果在类中定义了公共的变量并给予了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时没有形参,则调用类中对应的构造函数。
3、当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。请自行编写示例代码验证以上结论。
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();
}
}
4、请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
(静态变量、静态初始化块)>(变量、初始化块)>构造器。而静态变量、初始化块之间,变量、初始化块间的顺序取决于它们在类中出现的先后顺序。
5、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
请编写代码验证你的想法。
答:先实例化一个对象再调用。
package com;
public class Test {
public static void main(String[] args){
Foo f;
f=new Foo();
f.display();
}
}
class Foo{
public static void display(){
System.out.println("调用成功!");
}
}
6、两对整数明明完全一样,为何一个输出true,一个输出false?
答:两个变量都是Integer,赋值的时候调用了java.lang.String类,包含了字符串的值和实现比较特殊,可以不适用构造方法,就可以直接获得一个字符串对象。
6、不使用Eclipse,直接使用命令行运行Test1.java,Test2.Java,Test3.Java