求大佬给我讲解下这道题,最好有栈堆图分析,谢谢

ing X 2019-04-01 12:22:57
public class Book {

static Book book = new Book();
static int a;
static int b = 0;
private Book(){
a++;
b++;
}
public static void main(String[] args) {
Book book = new Book();
System.out.println(book.a);
System.out.println(book.b);
}

}
...全文
160 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-04-02
  • 打赏
  • 举报
回复
因为b=0;可能看不清楚 我把b=2,大家在看一下;


public class Book1 {
static Book1 book = new Book1();
static int a;
static int b=2;
private Book1() {
// TODO Auto-generated constructor stub
System.out.println("a="+a+",b="+b);
a++;
b++;
System.out.println("a="+a+",b="+b);
}

public static void main(String[] args) {
System.out.println("start main -- book");
Book1 book = new Book1();
Book1 book1= new Book1();
System.out.println(book1.a);
System.out.println(book1.b);
}
}



a=0,b=0
a=1,b=1
start main -- book
a=1,b=2
a=2,b=3
a=2,b=3
a=3,b=4
3
4



这里static b=2;
等同于 static b;
static {b=2};
静态赋值优先高于,静态块,所以b=2 其实是在构造之后执行的,而且只执行一次。

toward_south 2019-04-01
  • 打赏
  • 举报
回复
执行顺序优先级:静态块>main()>构造块>构造方法 这3个就是静态块,同是静态块,按声明的顺序执行 static Book book = new Book(); static int a; static int b = 0; 首先执行 static Book book = null,同时a,b声明时获取基本类型的标准初值,也就是a=0,b=0; 因为每产生一个book对象都需要调用一次构造方法,此时就执行了构造方法,这时候a=1,b=1,book对象才真正的产生。其次执行static int b = 0; 这时候b被重新赋值为0 然后进入main()方法里,执行Book book = new Book(); 此时又调用构造方法,a=2,b=1 打印输出 这里需要明确的是静态变量的声明和初始化是两种不同的操作 a,b声明的时候他就已经获取到了基本类型的标准初值 a只是声明,b是初始化。 由于静态变量声明的时候就已经确定了内容的位置,所以静态变量的声明和初始化的顺序可以颠倒。 static int b = 0; 等同于 static int b; static{ b =0; }
qq_39936465 2019-04-01
  • 打赏
  • 举报
回复
这里

static int b=0;

事实上是执行的 static int b; b=0;

static 申明只执行一次,赋值还是会执行的,所以b再次被赋值为0;
gh6883123 2019-04-01
  • 打赏
  • 举报
回复
初始化顺序:静态大于非静态,块大于成员变量、成员变量大于函数,同等级的先声明先初始化,大概就可以这么分
这个类中初始化顺序为book、a、b 、构造函数(构造函数可视为静态函数)
book、a、b是静态变量,一个类只有一个相同的静态变量
执行顺序:book初始化,新构建第二个Book类,进入第二个Book类
book已经初始化了,a、b初始化等于0,执行Book类的构造函数开始时输出0、0,++后变成1、1
执行完构造函数后,返回第一个Book类,b重新赋值为0,a、b在构造函数开始时输出1、0,++后变成2,1
十八道胡同 2019-04-01
  • 打赏
  • 举报
回复
package com.demo;

public class Book {
    static Book book = new Book();
    static int a;
    static int b = 0;
    private Book(){
        System.out.println("a="+a+",b="+b);
        a++;
        b++;
        System.out.println("a="+a+",b="+b);
    }

    public static void main(String[] args) {
        System.out.println("start main -- book");
        Book book = new Book();
        System.out.println(book.a);
        System.out.println(book.b);
    }

}
输出: a=0,b=0 a=1,b=1 start main -- book a=1,b=0 a=2,b=1 2 1 https://www.cnblogs.com/DreamDrive/p/5428622.html 我也不是很理解输出,等待大佬出现。

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧