zoukankan      html  css  js  c++  java
  • 03-类与对象-动手动脑

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

    输出结果为false。因为当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象,换句话说,“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。obj1和obj2虽然都是Foo类型的变量,但其指向的空间或者地址不同,所以输出的是false。

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

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

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

    public class InitializeBlockClass {
    
        {        
            field = 200;        
        }    
        public int field = 100;    
        public InitializeBlockClass(int value){
            this.field = value;        
        }
         public InitializeBlockClass(){
        }
         public static void main(String[] args) {
            InitializeBlockClass obj = new InitializeBlockClass();
            System.out.println(obj.field);
            obj = new InitializeBlockClass(300);
            System.out.println(obj.field);
        }
    }    

    运行结果为:

    如果有多个不同地方对字段进行初始化,那么该字段的最终取值取决于最后一次初始化。

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

    运行结果为:

    静态初始化块的执行顺序:

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

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

    5、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法?请编写代码验证你的猜想。

    在静态方法中使用new进行实例化,然后再调用非静态成员。

     1 public class Task {    
     2     public int a = 2;    
     3     static int b = 3;    
     4     static void display()    
     5     {        
     6         Task t1 = new Task();        
     7         System.out.println("a="+t1.a);        
     8     }
     9     public static void main(String[] args) {
    10         Task t2 = new Task();        
    11         t2.display();       
    12     }
    13 }

    输出结果为:

  • 相关阅读:
    Asp.Net Core 轻松学-被低估的过滤器
    Asp.Net Core 轻松学-利用文件监视进行快速测试开发
    Asp.Net Core 轻松学-利用xUnit进行主机级别的网络集成测试
    Asp.Net Core 轻松学-HttpClient的演进和避坑
    Asp.Net Core 轻松学-基于微服务的后台任务调度管理器
    Asp.Net Core 轻松学-一行代码搞定文件上传
    .NET Core 2.2 新增部分功能使用尝鲜
    Asp.NetCore轻松学-业务重点-实现一个简单的手机号码验证
    Asp.Net Core 轻松学-实现跨平台的自定义Json数据包
    Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档
  • 原文地址:https://www.cnblogs.com/kangxy/p/7700682.html
Copyright © 2011-2022 走看看