• java动手动脑3(类与对象)


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

    分析:

    ==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等

    ==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

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

    因为obj1 obj2是类Foo的两个对象,所以此时比较的是两个对象的地址,所以输出false

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

    如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。因为下面的Foo类中提供出了自己的构造方法,所以用new默认构造方法不再提供使用。

    3、请依据代码的输出结果,自行总结Java字段初始化的规律。

    分析:

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

    ②执行类的构造函数。

    4、

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

    结果:

    分析:

    静态初始化块只执行一次。

    创建子类型的对象时,也会导致父类型的静态初始化块的执行。先执行父类静态初始化块然后再执行自己这个类的静态初始化块。

    5、

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

    public class Test{
        public static void main(String[] args) 
        {
            Test1 t=new Test1();
            int a=t.get();
            t.input(a);
         }
    
    }
    class Test1
    {
        int b = 100;
        public int get()
        {
            return b;
        }
          public static void input(int a)
        {
            System.out.println(a);
        }
      
    }

    结果:

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

    public class Cratenumber {
        
    
             int number;
    
         Cratenumber()
    
           {
    
                number=number+1;
    
              System.out.println("目前创建了"+number+"个对象");
    
           }
    
           public static void main(String[]args)
    
          {
    
              @SuppressWarnings("unused")
    
              Cratenumber obj=new Cratenumber();
    
          }
    
     }

    结果:

  • 相关阅读:
    linux整理
    C++ 11 多线程--线程管理
    VS2013 配置全局 VC++目录
    visual studio运行时库MT、MTd、MD、MDd的研究
    C++(vs)多线程调试 (转)
    VS工程和Qt工程转换
    Qt 读写XML文件
    win32开发中多字节(ANSI)和宽字符(UNICODE)字符串处理函数参考
    QMenu----QT鼠标右键弹出菜单
    C++ 单例模式析构函数的运用,析构函数的线程安全
  • 原文地址:https://www.cnblogs.com/hanbook/p/5984329.html
Copyright © 2020-2023  润新知