面试题----static

public class Error {

    public static void main(String[] args) {
      System.out.println(StaticText.x);
      System.out.println(StaticText.y);
    }

}

class StaticText{
public static StaticText st=new StaticText();//在这个位置答案是1 4
public static int x;
public static int y=4;
//public static StaticText st=new StaticText();//在这个位置答案是1 5
public StaticText() {
    x++;
    y++;
}
}

//加载和执行
/*
 *                       加载(加载到静态区赋予初始值)      执行(StaticText st=new StaticText())  执行(int x)   执行(int y=4)
 *       st      null                                  0x23ab45(一个地址值)                   0x23ab45        0x23ab45
 *       x        0                                    1                                      1                1
 *       y        0                                    1                                      1                4
 */

 

package cn.day011;
public class A {

    public static void main(String[] args) {
        System.out.println(ST.x+" "+ST.y); //1  1

    }
}
class ST{
    static ST st=new ST();//属性
    static int x=1;
    static int y;

    public ST() {
        x++;
        y++;
    }
}
//加载和执行
/*
 *                       加载(加载到静态区赋予初始值)      执行(StaticText st=new StaticText())  执行(int x=1)   执行(int y)
 *       st      null                                  0x23ab45(一个地址值)                   0x23ab45        0x23ab45
 *       x        0                                    1                                      1                1
 *       y        0                                    1                                      1                1
* int y只是声明,系统默认值在静态区已经赋值了,所以y执行到static int y ;还是1; */

package cn.day011;
public class A {

    public static void main(String[] args) {
        ST S=new ST();
        System.out.println(S.x+" "+S.y); // 2 2

    }
}
class ST{
    static ST st=new ST();//属性
    static int x=1;
    static int y;

    public ST() {
        x++;
        y++;
    }
}

 

package cn.day011;
public class A {

    public static void main(String[] args) {
        System.out.println(new ST().x+" "+new ST().y); // 2 3

    }
}
class ST{
    static ST st=new ST();//属性
    static int x=1;
    static int y;

    public ST() {
        x++;
        y++;
    }
}
//x比y少加一次

 

package cn.day011;
public class A {

    public static void main(String[] args) {
        ST S=new ST();
        System.out.println(S.x+" "+S.y); //栈溢出错误

    }
}
class ST{
    ST st=new ST();//属性
    static int x=1;
    static int y;

    public ST() {
        x++;
        y++;
    }
}
//等同于在堆中不断的开辟新空间,在栈中不断的开辟空间存放变量,因为栈远远小于堆所以栈溢出
//那么为什么加上static 不报错,因为static 只加载一次,空间也是开辟一次

 

posted @ 2019-06-27 16:47  三十六烦恼风x  阅读(177)  评论(0编辑  收藏  举报