java第五周课后作业

1.使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

代码

package test;

public class test { 
    private static int n=0;
    public test()
    {
        n=n+1;//每次new一个对象的时候都可以给n加1
    }   
    public static void main(String[] args) {
        @SuppressWarnings("unused")
        test t1=new test();
        @SuppressWarnings("unused")
        test t2=new test();
        @SuppressWarnings("unused")
        test t3=new test();
        System.out.println("共有对象个数为:"+n);
    }
    }

运行结果:

思想 

设计公共类逐次计数,当创建一个新的类时n+1;每次new一个对象的时候都可以给n加1,实现对象的计数。最后返回n计数

动手动脑

1,请输入并运行以下代码,得到什么结果?

 public static void main(String[] args) {
        // TODO Auto-generated method stub
  
        Foo obj1=new Foo();
        Foo obj2=new Foo();
        System.out.println(obj1==obj2);
    }
}
class Foo
{
   int value=100;    
}

运行结果:

原因:

当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等 当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。 引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

 

2.以下代码为何无法通过编译?哪儿出错了?

 

package test;

public class test { 
    
    public static void main(String[] args) {
        Foo obj1=new Foo();      
    }
    }       

class Foo{
    int value;
    public Foo(int initValue) {
        value=initValue;
    }
}

原因:在Foo类中已经有了一个Foo的含参构造方法,所以在定义Foo类对象时不能使用new Foo()方法。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

3.如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

package test;

public class test { 
    
    /**
     * @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字段初始化的规律:

总结:所有的静态初始化块都优先执行,其次是非静态的初始化块和构造函数,它们的执行顺序是:父类的静态初始化块>子类的静态初始化块>父类的初始化块>父类的构造函数>子类的初始化块>子类的构造函数.

 

posted on 2018-10-21 16:34  somethingα  阅读(122)  评论(0编辑  收藏  举报