zoukankan      html  css  js  c++  java
  • Java基础知识陷阱(三)

    本文发表于本人博客

        之前都讲了有关字符串的陷阱,那今天来说下关于静态这个东西,这分为静态变量、静态方法,先看下面的代码请问结果输出是什么?:

    class Person01{    
        private static Person01 person = new Person01();
        public static int age;    
        public static int hight = 0;    
        private Person01(){
            age++;
            hight++;
        }    
        public static Person01 GetInstance(){
            return person;
        }    
    }

    在main中进行调用

            Person01 person = Person01.GetInstance();
            System.out.println("age:" + person.age + ";hight:" +  person.hight);

    这 个有可能有工作1年2年的也没有说出正确的答案。这个题目考察的是静态变量初始化顺序,现在我们来分析下:当main函数中使用Person01 person = Person01.GetInstance();调用静态方法的时候,首先回去查找有静态变量存在不,如果存在则从上往下先执行,这里是从person, 在到age、hight,由于person是需要调用构造的所以这句完毕后age、hight都已经是为0了,再往下执行static变量,然而对于 age它只是申明并没有赋值操作,所以跳过了,再往下就是对hight赋值了,都完毕后则return person返回这个对象,所以输出是:

       age:1;hight:0

    如果还有怀疑可以把对age以及hight这2句放到person对象前面再执行查看结果,可以看到输出的结果是:

       age:1;hight:1

    至此你不相信总之我是信了!那接下来我们修改下代码,如下:

    class Person01{    
        private static Person01 person = new Person01(10,100);
        public static int age;    
        public static int hight = 0;    
        private Person01(int age,int hight){
            age = age;
            hight = hight;
        }    
        public static Person01 GetInstance(){
            return person;
        }    
    }

    上面代码跟之前的代码相比只是在new构造的时候传递参数了,请问现在输出又是什么?我估计这里有些人被打虎眼了,先看结果:

        age:0;hight:0

    为 什么呢?我们可以再new Person01(10,100)处开始说说,这里new构造传递了参数了,在构造函数中,age、以及hight2个变量是临时变量不是类 Person01的变量哦,所以这里的操作是改变这个构造函数方法内的变量的值而已,不会影响类的变量,这样结果可想而知了。大家这里可以想象如果使用 this关键字呢,结果如何?结果还是:

        age:10;hight:0

    上面的例子只是说了静态函数以及静态字段,现在我们来看看如果在继承子类父类都出现了构造以及静态代码库,那么这样的执行顺序是怎样的呢,看下面代码:

    class Person{
        static String name = "www.luoliang.me";
        static{
            System.out.println("Person");
        }
        public Person(){
            System.out.println("Person()");
        }
    }
    class Man extends Person {
        static String name = "luoliang.me";
        static{
            System.out.println("Man");
        }
        public Man(){
            System.out.println("Man()");
        }
    }

    main方法中调用如下:

        public static void main(String[] args) {        
            new Man();
        }

    输出结果是什么呢,这个问题确实是TMD的,带了好多代码但是唯独这个静态代码快的基本没用,最后问朋友也没说对答案,看答案:

    Person
    Man
    Person()
    Man()

    这个答案没有想到吧,不过想想又觉得是非常合符的,毕竟有静态代码的先执行静态代码,这个比构造函数优先级还高啊!这次先到这里,明天继续。

  • 相关阅读:
    Binary Tree Maximum Path Sum
    ZigZag Conversion
    Longest Common Prefix
    Reverse Linked List II
    Populating Next Right Pointers in Each Node
    Populating Next Right Pointers in Each Node II
    Rotate List
    Path Sum II
    [Leetcode]-- Gray Code
    Subsets II
  • 原文地址:https://www.cnblogs.com/luoliang/p/4147156.html
Copyright © 2011-2022 走看看