zoukankan      html  css  js  c++  java
  • 3类与对象

     一、java字段初始化规律

    如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?根据下面代码结果,总结java字段初始化规律。

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

    结果截图:

    类的初始化块:可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员。类的这种“没有名字”的“成员”,多用于初始化类的字段。{value=100;}即为初始化块
    100即InitializeBlockClass类中当public int field在初始化块filed=200之后的值100,若在初始化块之前,则输出的值为filed=200;300即为构造方法输出的值。
    1执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
    2执行类的构造函数。
    注:类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
     
     
    二、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
     1 package opinion;
     2 public class Interet {
     3 int age=0;//实例成员
     4 static String name="sherry";//静态成员
     5 static void create()
     6 {
     7        System.out.println("实例成员"+new Interet().age);
     8         //在静态方法中访问类的实例变量需首先进行类的实例化
     9        System.out.println("静态成员"+name);
    10        //在静态方法中可直接访问类的静态变量 推荐使用类名来直接访问静态字段
    11 }
    12 public static void main(String[]args)
    13 {
    14        Interet.create();
    15        }
    16 }

    结果截图:

    三、

    如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
    (本题则无new Foo()无参构造函数)
    四、查看以下代码,两对整数明明完全一样,为何一个输出true,一个输出false?
     1 public class StrangeIntegerBehavior
     2 {
     3     
     4        public static void main(String[] args)
     5        {
     6         
     7              Integer i1=127;
     8        
     9              Integer j1=127;
    10         
    11              System.out.println(i1==j1);//true
    12         //调用Integer.valueOf(),它的范围为-128~127
    13              Integer i2=139;
    14         
    15              Integer j2=139;
    16         
    17              System.out.println(i2==j2);//false
    18        }

    提示: 使用javap来分析生成class文件,看它调用了Interger类的哪个方法,然后打开JDK源文件查看源码,就可以找到答案。

    经查验,发现其调用Integer.valueof(),其范围为-128~127,即超出有效范围,无法正常比较。

  • 相关阅读:
    接口自动化1-基础知识
    pytest-fixture之conftest.py
    测试人员一定要懂的ADB操作,赶紧来看一看~
    必看!利用装饰器,帮你自动处理异常并优雅实现重跑case
    最全Airtest接口功能介绍和示例总结,新手同学千万不能错过呀!(二)
    总结一波 Redis 面试题,收藏起来!
    IntelliJ IDEA 2020.2.4款 神级超级牛逼插件推荐
    华为 Java 开发编程军规,谁违反谁走
    CTO:再写if-else,逮着罚款1000!
    VSCode 上竟然也能约会,谈对象了???
  • 原文地址:https://www.cnblogs.com/watm/p/7687497.html
Copyright © 2011-2022 走看看