zoukankan      html  css  js  c++  java
  • 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字段初始化的规律:

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

  • 相关阅读:
    [蓝桥杯] 练习系统-算法提高-ADV-292 【计算行列式】之10分钟AC Apare_xzc
    [洛谷] P1004 方格取数 Apare_xzc dp
    汤森路透 Thomson Reuters --使用多模型数据库ArangoDB 打造快速安全的简洁视图分析
    图数据库与关系数据库的实验对比——意大利商会 InfoCamere 案例
    尊重开源,且用且珍惜
    使用数据库创建的Flash 游戏- Pronto Move Shard
    NoSQL分布式数据库的独家见解- Adam Fowler
    融合RocksDB, Pregel, Fault-Tolerent Foxx & Satellite Collections 怎样使数据库性能提升35%?
    怎么用多模型数据库为复杂数据建模?--航空舰队实例
    动态数据源四种实现方案对比
  • 原文地址:https://www.cnblogs.com/qq1793033075/p/9825532.html
Copyright © 2011-2022 走看看