zoukankan      html  css  js  c++  java
  • Java第六周课堂示例总结

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

     1 public class InitializeBlockDemo {
     2 
     3     /**
     4      * @param args
     5      */
     6     public static void main(String[] args) {
     7         
     8         InitializeBlockClass obj=new InitializeBlockClass();
     9         System.out.println(obj.field);
    10         
    11         obj=new InitializeBlockClass(300);
    12         System.out.println(obj.field);
    13     }
    14 
    15 }
    16 
    17 class InitializeBlockClass{
    18     //下面这句在初始化块之前与之后,会影响到field字段的初始值
    19     //public int field=100;
    20     
    21     {
    22         field=200;
    23     }
    24     public int field=100;
    25     public InitializeBlockClass(int value){
    26         this.field=value;
    27     }
    28     public InitializeBlockClass(){
    29         
    30     }
    31 }

    运行结果:

    若field定义在代码块之前:                                       

     若在代码块后面:

    可以得出结果:构造函数的优先级最高,最后一定执行构造函数。设定了字段的初始值与代码块的优先级相同,在没有构造函数的情况下,按照顺序依次执行,得到后面的结果。

    二、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员?

    package TestDemo;
    
    public class E {
        int x=3;
        public static void f(){
            E a=new E();
            System.out.println(a.x);
        }
        public static void main(String[] args) {
            E x=new E();
            x.f();
        }
    }

    可以通过在静态方法中将一个对象的引用传入到静态方法中,便可以调用该对象的非静态方法。

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

     1 package TestDemo;
     2 
     3 public class E {
     4     static int x=0;
     5     E(){
     6         x++;
     7     }
     8 
     9     void f() {
    10         System.out.println("你共创建了"+x+"个");
    11     }
    12     public static void main(String[] args) {
    13         E a=new E();
    14         a.f();
    15         E b=new E();
    16         E c=new E();
    17         E d=new E();
    18         d.f();
    19     }
    20 }

    运行结果:

    四、 对象判等:

     

    运行结果为false

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

    两个对象的“内容”,其实是指它们在某一时刻的所有字段的值,“内容相等”,其实是就“对应字段值”一致。 在Java中要比对两个对象的字段值,可以 “重写(override)”基类的equals()方法。

    五、装箱与拆箱问题:

        public static void main(String[] args) {
            int value=100;
    
            Integer obj=value;  //装箱
    
            int result=obj*2;     //拆箱
    
        }

    简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

    反编译结果:

    可以看到分别调用了 Integer.valueOf();和 Integer.intValue();方法

    看如下代码:

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

    解答:

     反编译

    方法 Integer.valueOf();源代码:

    public static Integer valueOf(int i) {
        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }

    可以看到,当i不符合范围时为创建一个Integer的对象,故不相等。

  • 相关阅读:
    学习进度总结表
    关于软件工程的问题
    自我介绍
    web安全
    spring profile
    spring 装配
    python Descriptor (描述符)
    python string intern
    Java 对象内存占用
    java jdb命令详解
  • 原文地址:https://www.cnblogs.com/dongao/p/11674246.html
Copyright © 2011-2022 走看看