zoukankan      html  css  js  c++  java
  • 10月6日动手动脑

    1.Integer的诡异特性

    public class StrangeIntegerBehavior
    {


    public static void main(String[] args)
    {


    Integer i1=100;

    Integer j1=100;

    System.out.println(i1==j1);


    Integer i2=129;

    Integer j2=129;

    System.out.println(i2==j2);

    }


    }

    输出结果:true

    false

    原因:JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。

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

    在静态方法中创建类的对象,通过对象来调用实例成员。

    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.如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算


    public class InitializeBlockDemo {

    /**
    * @param args
    */
    public static void main(String[] args) {

    InitializeBlockClass obj=new InitializeBlockClass();
    System.out.println(obj.field);

    obj=new InitializeBlockClass(300);
    System.out.println(obj.field);
    }

    }

    class InitializeBlockClass{
    //下面这句在初始化块之前与之后,会影响到field字段的初始值
    //public int field=100;

    {
    field=200;
    }
    public int field=100;
    public InitializeBlockClass(int value){
    this.field=value;
    }
    public InitializeBlockClass(){

    }
    }

    测试结果:

     结果分析:如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。

    5.判断对象是否相等

    部分代码:

    foo f1=new foo();

    foo f2=new foo();

    system.out.println(f1==f2);

    结论:不相等,对象相等由对象的地址是否相等来比较

  • 相关阅读:
    文件查找和压缩
    shell脚本编程基础
    [模板]数据生成与对拍
    Codeforces Round #746 (Div. 2)
    Codeforces Round #712 (Div. 2)
    Codeforces Round #715 (Div. 2)
    Codeforces Round #752 (Div. 2)
    提高模拟赛Day8T3树上跑步
    提高模拟赛Day8T2最大匹配
    提高模拟赛Day8T1求中位数
  • 原文地址:https://www.cnblogs.com/buyaoya-pingdao/p/13775425.html
Copyright © 2011-2022 走看看