• java课后作业-5


    作业一:请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?“

    程序源代码;

    public class Lei {

    /**

    * @param args

    */

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    lei1 a=new lei1();

    lei1 b=new lei1();

    b.out();

    }

    }

    class lei1{

    static int n=0;

    lei1(){

    n++;

    }

    public void out(){

    System.out.println("你已经创建了"+n+"个对象!");

    }

    }

    程序结果截图: 

    课后作业二:动手动脑

    (1):以下代码为何无法通过编辑,哪出错了?

    程序源代码:


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

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

    错误:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

    (2)使用上页幻灯片中定义的类,以下代码输出结果是什么?

    程序源代码:

    public class Test2 {
    /**
    * @param args
    */
     public static void main(String[] args) {
    // TODO Auto-generated method stub
      InitializeBlockClass obj=new InitializeBlockClass();
      System.out.println(obj.field);//?

      obj=new InitializeBlockClass(300);
      System.out.println(obj.field);
     }
    }
    class InitializeBlockClass{
     {field=200;}
     public int field=100;
     public InitializeBlockClass(int value){this.field=value;}
     public InitializeBlockClass(){}
    }

    运行结果截图:

    结论:

    执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。 执行类的构造函数。

    类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

    (3)请运行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();
      

     }
    }

    程序运行截图:

    结论:

    静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。

    (4)静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

    程序源代码:

    class Example

     {  

            public static void display()

            {

                 System.out.println("类的方法");

             }

     public void displayOne()

     {

            System.out.println("对象的方法");

     }

      public static void main(String[] args) 

    {

               Example.display();

               Example e=new Example();

               e.displayOne();   

               e.display();

     }

    }

    (5)上述神奇代码(StrangeIntegerBehavior.java)输出诡异的结果,原因何在?

    结论:因为它们调用的Interger类的方法不同

    (6)两对整数明明完全一样,为何一个输出true,一个输出false?

    程序源代码:

    public class test {
    /**
    * @param args
    */
     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;
    }

    结论:

    引用代表地址,“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

  • 相关阅读:
    Python深入03 对象的属性
    利用Webkit抓取动态网页和链接
    分享:OCILIB 3.11.0 发布,跨平台 Oracle 驱动
    Knockoutjs实战开发:控制子绑定(control descendant bindings)
    利用InjectedBundle定制自己的Webkit(二)
    使用solrj和EasyNet.Solr进行原子更新
    Chaos网络库(二) Buffer的设计
    分享:djangohaystack+solr实现搜索
    Moon.ORM 4.4 隆重发布,在性能和使用便捷上一挑群雄(mysoft,cyq,pdf)
    数据结构利器之私房STL(中)
  • 原文地址:https://www.cnblogs.com/kangy123/p/5983844.html
Copyright © 2020-2023  润新知