2 wuwenxiong12 wuwenxiong12 于 2016.09.23 20:35 提问

有关static的问题,求解啊!!!! 1C

下面的程序能通过编译吗?如果能,说出结果并解释,不能编译,请说明错误原因
class A
{
public static int X; // ------ 1
static {X=B.Y+1;} // -------2
}
public class B

{
public static int Y=A.X+1; //------3
static{} //------4
public static void main(String[] args){
System.out.println("X = "+A.X+",Y = "+B.Y); //-----------5
}
}

7个回答

u013096045
u013096045   2016.09.23 21:17

结果:X = 1,Y = 2
原理分析:
首先加载class b,运行b的静态代码块
y=a.x+1 实际是运行:
y=0 ;
y=a.x+1;

运行y=a.x+1这一句时,因为用到a的非final static 属性,所以要先加载class a
a.x=0;
a.x=b.y+1=0+1=1
class a加载完

那么y=a.x+1=1+1=2
class b加载完

运行main 方法
输出X = 1,Y = 2

mengxianghn
mengxianghn 回复wuwenxiong12: 我错了,java类的对象中确实是默认为0,和C++搞混掉了
接近 2 年之前 回复
mengxianghn
mengxianghn 回复wuwenxiong12: 这个是因为static int 默认初始为0 吧
接近 2 年之前 回复
wuwenxiong12
wuwenxiong12 回复菜鸟_闯江湖: 好的,谢谢,大概有点理解了!!!
接近 2 年之前 回复
wuwenxiong12
wuwenxiong12 回复wuwenxiong12: 是不是可以将public static int Y=A.X+1; static{} 等效理解为public static int Y;static{Y=A.X+1;}呢,这样就很好理解了
接近 2 年之前 回复
qq_34468883
qq_34468883 回复wuwenxiong12: int类型的值默认为0,在得到具体赋值之前都是以0存在的。
接近 2 年之前 回复
u013096045
u013096045 回复wuwenxiong12: int型 默认为0 class C{int i; } 你print new c().i 看看
接近 2 年之前 回复
wuwenxiong12
wuwenxiong12 y=a.x+1 实际是运行: y=0 ; y=a.x+1;这里有点不懂啊,y的值怎么就为0了呢!!!!
接近 2 年之前 回复
oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.23 21:06

亲测,可以通过编译,结果是:X = 1,Y = 2

wuwenxiong12
wuwenxiong12 我也测过了啊,不过不懂原理啊,debug都搞不出来
接近 2 年之前 回复
feng1790291543
feng1790291543   Ds   Rxr 2016.09.23 21:04

静态可以这样使用?static {X=B.Y+1;}?好像有问题吧

qq_34523010
qq_34523010 静态代码块
接近 2 年之前 回复
wuwenxiong12
wuwenxiong12 这种写法也是最近面试碰到的,晕啊!!!
接近 2 年之前 回复
qq_34468883
qq_34468883   2016.09.24 09:33

这个问题好,关键看对类的加载顺序了解不了解

wuwenxiong12
wuwenxiong12 是啊,考的就是这个,不过有点不太理解耶
接近 2 年之前 回复
quasimodo_es
quasimodo_es   2016.09.24 16:47
 class A {
    public static int X; // 步骤2:X=0
    static {
        X = B.Y + 1; //步骤3:依赖了B,取B的值;步骤5,X = 0+1
    } 
}
public class B{
    public static int Y = A.X + 1; //步骤1:依赖了A,加载A  //步骤4:Y=1+1 
    static {//步骤6
    } 
    public static void main(String[] args) {
        System.out.println("X = " + A.X + ",Y = " + B.Y); //编译期间加载完毕,运行,结果 X=1,Y=2
    }
}
quasimodo_es
quasimodo_es 回复wuwenxiong12: 步骤5,B.Y ,所以先走步骤4
接近 2 年之前 回复
wuwenxiong12
wuwenxiong12 步骤1中是不是此时还未加载A无法得出表达式的值所以系统默认给Y赋值0呢?怎么感觉步骤4和步骤5的顺序反了啊
接近 2 年之前 回复
quasimodo_es
quasimodo_es   2016.09.24 16:56

仅供参考比较

 public class BTest {
    public static void main(String[] args) {
        //A.X 和  B.Y 是不一样的,加载顺序不同
        System.out.println(A.X); //步骤6 ,X=2
    }
}

class A {
    public static int X; // 步骤1:X=0
    static {
        X = B.Y + 1; //步骤2:依赖了B,加载B;   //步骤5,X = 1+1 
    } 
}
class B{
    public static int Y = A.X + 1; //步骤3:Y=0+1 
    static {//步骤4
        System.out.println("X = " + A.X + ",Y = " + B.Y); //X=0,Y=1
    } 
}
zlt995768025
zlt995768025   2016.09.26 15:26

X = 1,Y = 2

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
贝叶斯统计
1763年英国学者T.贝叶斯在文章《论有关机遇问题的求解》中提出一种归纳推理的理论,后被一些统计学者发展为系统的统计推断方法,称为贝叶斯方法。采用这种方法作统计推断所得的全部结果,构成贝叶斯统计的内容。认为贝叶斯方法是唯一合理的统计推断方法的统计学者,组成数理统计学中的贝叶斯学派,其形成可追溯到 20世纪 30 年代。到50~60年代,已发展为一个有影响的学派。时至今日,其影响日益扩大。 在贝叶
Java面试题--static关键字
Java面试题 ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?在Java中,“static”是“静态”的意思,可以用于修饰成员方法和成员变量,也可以用于定义代码块。被“static”修饰的成员方法和成员变量独立于该类,不依赖类的特定实例,被类的所有实例共享。 Java中不能覆盖private方法也不能覆盖static方
面试题——static详解
像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、PROLOG、Ada等语言中也是有出现的,只是有着不同的作用,对于其具体作用,读者有需要的时候是可以具体查阅的。中文名 static 分类关键字举例 VB,C#,C,C++,PHP 来
基于矩阵的流程数学模型的一个小问题
      前几天看到一篇由国家自然科学基金和863计划资助的科研论文(“基于矩阵模型的工作流合理性验证算法研究”  http://www.doc88.com/p-18165361363.html)中,作者提到用一种矩阵模型来表示流程,用矩阵和向量的方式来代替PT网表示流程图和流程状态值,但是我觉得常规矩阵模型中的元素只能够表示流程图中的拓扑连接线,要表达节点和节点状态就需要增加一组向
人工智能三个基础问题的思考——学习笔记(一)
1,机器学习是用怎样的思路解决问题的?我们在机器学习中面临的任务最典型的是:有很多数据,怎样从现有数据建立一个模型,通过这个模型来预测未知的数据。这相模型就是一个从自变量到目标变量的一个映射:可以表示成y=f(x),只要我建立起了这样的模型,那有了自变量x,就可以通过模型求出y。答:机器学习学习的过程就是建立模型并求解f的过程。常用的模型,有决策树、线性回归、逻辑回归、SVM等等,这么多模型哪一种...
求解线性方程组
一、写在前面实验目的(1) 熟悉求解线性方程组的有关理论和方法; (2) 能编程实现雅可比及高斯-塞德尔迭代法、列主元高斯消去法、约当消去,追赶法 (3) 通过测试,进一步了解各种方法的优缺点 (4) 根据不同类型的方程组,选择合适的数值方法实验内容 **本次实验参考公式** 二、实验过程 【参考代码】#include <stdio.h> #include <stdlib.h> #incl
一道有关static的题目
一道有关static的题目/** * * @title:StaticSample.java * @Package:com.you.hbxs.model * @Description:一句话描述功能 * @author: * @date:2016-2-24下午9:59:39 * @version V1.0 * */ package com.you.hbxs.model; /**
有关static的问题
C程序一直由下列部分组成:       1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;       2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。       3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。        4)栈——增长方向:自顶向下增长;自动变量以
时间序列icuhuanzh额
有关啊hi及ANXULIE,SHISHIJIANXULIEWEN,时间序列问题,
数据结构--用栈求解迷宫问题(非最优解)
数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦。 BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点,如果从(1,1)点开始判断如图那么它的右(1,2)下(2,1)都是可走点那么将右边的格子坐标进栈呢还是将下边的格子坐标进栈?书本上给的代码是先判断上边格子再判断右边格子再判断下边格子再判断左边格子