请教各位大神,一道java面试题的执行思路,谢谢!

qq_29448025 2017-06-30 11:42:58
...全文
940 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
戴小码 2017-07-07
  • 打赏
  • 举报
回复
1.静态域a默认初始值为0,调用了两次构造器变为2; 2.静态域b先调用一次构造器变为1,由于static域是按照定义顺序初始化,所以又被初始化为0,接着再调用一次构造器变为1,这就是初始化过程; 3.附上初始化顺序:静态域-->非静态域-->构造器。
qq_32626543 2017-07-07
  • 打赏
  • 举报
回复
public class Test { public static int a ; public static int b = 0; public static Test eee = new Test(); public Test(){ a++; b++; } public void printAB(){ System.out.println(a+","+b); } public static void main(String[] args) { new Test().printAB(); } } 这样的话输出的就是2,2了
qq_32626543 2017-07-07
  • 打赏
  • 举报
回复
static按照顺序执行,第一个执行 public static Test eee = new Test();时调用构造方法,此时a=1,b=1 接着执行赋值操作,b=0;所以这个类加载完成的时候a=1,b=0;
快乐的打字员 2017-07-04
  • 打赏
  • 举报
回复
引用 2 楼 oDianXiaoEr1 的回复:
B在第二次类实例化的时候被重新赋值为0了吧
赞同 不能说是第二次实例化, 应该是第一次实例化中被第二次赋值为0
快乐的打字员 2017-07-04
  • 打赏
  • 举报
回复
递归么,好怕怕
杀猪剑客 2017-07-02
  • 打赏
  • 举报
回复
引用 11 楼 sqzczwj 的回复:
test在实例化的时候b有重新赋值为0;
你这种说法是错误的! 因为第一次加载类的时候,先执行静态属性Test eee = new Test()。调用完构造方法后(a=1 ,b=1), 会执行static代码块(a=1,b=0)。 main方法 再次new Test()的时候 (a=2,b=1)。最后执行printAB方法打印
IT劝退师 2017-07-02
  • 打赏
  • 举报
回复
test在实例化的时候b有重新赋值为0;
三个半西红柿 2017-07-01
  • 打赏
  • 举报
回复
类实例化时运行顺序 静态变量->静态初始化块->变量->变量初始化块->构造方法 并不认同楼上的那种分解方式,同时他所说的顺序是有子父类的初始化流程。 在静态代码块中是可以定义与类中命名相同的局部静态变量,所以楼上的分解方式不成立。
baidu_37278726 2017-07-01
  • 打赏
  • 举报
回复
引用 8 楼 baidu_37278726 的回复:
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 (2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 (3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。 (4)执行父类构造方法。 (5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。 (6)执行子类构造方法。 复制粘贴。。。

public static int num=15;
//分解成
public static int num;
static{
    num=15;
}

static
{
     num=15;
}
public static int num=0;
//可以想象成这样:
static
{
    num=15
    num=0;
    ;
}
public static int num;
//打印 num就是0;
//同理
public static int num=0;
static
{
    num=15;
}
//可以想象成
public static int num;
static
{
   num=0; 
   num=15;
}
不知道对不对,没有权威性,大佬可以解释下
baidu_37278726 2017-07-01
  • 打赏
  • 举报
回复
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 (2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 (3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。 (4)执行父类构造方法。 (5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。 (6)执行子类构造方法。 复制粘贴。。。

public static int num=15;
//分解成
public static int num;
static{
    num=15;
}
soton_dolphin 2017-06-30
  • 打赏
  • 举报
回复
其实这段代码相当于下面的样子:

public class Test {
	public static int a;
	public static int b;
	public static Test eee = new Test();
	
	static{
		b = 0;
	}
	
	public Test(){
		a ++;
		b ++;
	}
	
	public void printAB(){
		System.out.println(a + "," + b);
	}
	
	public static void main(String[] args){
		new Test().printAB();
	}
}
飞翔小Teemo 2017-06-30
  • 打赏
  • 举报
回复
B在第二次类实例化的时候被重新赋值为0了吧
qq_29448025 2017-06-30
  • 打赏
  • 举报
回复
我的答案是2,2 而正确答案竟然是2,1 这是为什么呢?
wgd81685 2017-06-30
  • 打赏
  • 举报
回复
静态代码块,静态变量的执行顺序跟你的代码书写的顺序是相同的
MikeDDT009 2017-06-30
  • 打赏
  • 举报
回复
楼上思路正确,这个最主要的思路在于两点: 1.静态属性或者说字段也或者直接说变量,是整个类只有一个的,也就是不论你创建多少个对象,这个静态的属性都是整个类型共有的,谁都可以去改变。 2.创建对象时候,对象初始化的顺序。顺序这样,静态区域块>静态属性>一般属性>构造器。这样来的。
windsigirl123 2017-06-30
  • 打赏
  • 举报
回复
代码可改写为:

public class Test {
	
	public static int a;
	public static int b;
	public static Test eee = new Test();

	static{
               b = 0;
               System.out.println("static");
    }
	
	public Test() {
		a++;
		b++;
		System.out.println("constructor");
	}
	
	public void printAB() {
		System.out.println(a + "," + b);
	}

	public static void main(String[] args) {

		new Test().printAB();
	}
}
执行结果: constructor static constructor 2,1 可知‘public static Test eee = new Test();’先于static块执行了,所以b的值为:0->1->0->1,即为1。
Alvis_you 2017-06-30
  • 打赏
  • 举报
回复
很简单,按你类变量的顺序执行,先new对象,调用构造方法,然后赋值,所以b变量就变0了。

62,628

社区成员

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

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