黑马程序员技术交流社区

标题: 我前几天去面试的题,关于类的,求解一下,不懂 [打印本页]

作者: 马胜骁    时间: 2013-3-16 18:36
标题: 我前几天去面试的题,关于类的,求解一下,不懂
class A
    {
        public static int X;
        static A()
        {
            X = B.Y + 1;
        }
    }
    class B
    {
        public static int Y ;
        static B()
        {
            Y = A.X + 1;
        }
        static void Main()
        {
            Console.WriteLine("x={0},y={1}",A.X,B.Y);
            Console.ReadKey();
        }
    }
作者: 许庭洲    时间: 2013-3-16 19:29
本帖最后由 许庭洲 于 2013-3-16 19:50 编辑

1. 不用new就能用的方法:static方法,static方法其实就是普通函数;
2. 在static方法中可以调用其他static成员,但是不能调用非static成员。
3. 在非static方法中可以调用static成员。
作者: 刘凯    时间: 2013-3-16 19:47
许庭洲 发表于 2013-3-16 19:29
1. 不用new就能用的方法:static方法,ststic方法其实就是普通函数;
2. 在static方法中可以调用其他static ...

这个题具体是让答什么的啊? 然后Console类里有WriteLine 和ReadKey的两个静态方法 ??我肿么木有找到
作者: 苏波    时间: 2013-3-16 19:56
都没有说你具体哪不懂
作者: 何红卫    时间: 2013-3-16 22:23
static的其中一个作用是默认初始化为0(对int),还有就是使局部变量变成了全局变量,这道题应该就是考查对static的理解。然后根据输出的顺序,一步一步调用就是了,不懂就单步调试一下应该也清楚了,输出结果:X=2,Y=3
如果不对请海涵啊,我没运行代码。
作者: itserious    时间: 2013-3-17 00:07
你上面用的是C#写的,下面我将它用java语言写了出来:



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class A
{
    public static int X;
    static void A()
    {
        X = B.Y + 1;
    }
}
public class B
{
    public static int Y ;
    static void B()
    {
        Y = A.X + 1;
    }
   public  static void main(String []args) throws InterruptedException, IOException
    {
       // Console.WriteLine("x={0},y={1}",A.X,B.Y);
            System.out.println("x="+A.X+",y="+B.Y);//与上面等价。
        //Console.ReadKey();//等待键盘输入才退出程序。为了使调试时看到输出结果。如果没有此句,命令窗口会一闪而过。与下面两句等效。
           
           
            BufferedReader bw=new BufferedReader(new InputStreamReader(System.in));
                    String str=bw.readLine();//程序在这处于阻塞状态,等待键盘输入。
    }
}

结果:x=0,y=0
作者: itserious    时间: 2013-3-17 00:13
不好意思,没看清楚,进错地方了,请原谅!!!!
作者: 韦俊琳    时间: 2013-3-17 02:31
初始化为A.X=0,B.Y=0;
A.X=B.Y+1;
B.Y=A.X+1;
结果
A.X=1B.Y=2
作者: 孔健    时间: 2013-3-17 14:13
楼上  正解!!
作者: 曾玉锋    时间: 2013-3-17 15:34
本帖最后由 曾玉锋 于 2013-3-17 15:50 编辑

调试后才清楚运行过程,谢楼主了哈。

作者: 曾玉锋    时间: 2013-3-17 15:46
class A
    {
        public static int X;
        static A()
        {
            X = B.Y + 1;
        }
    }
    class B
    {
        public static int Y ;
        static B()
        {
            Y = A.X + 1;
        }
        static void Main()
        {
            Console.WriteLine("x={0},y={1}",A.X,B.Y);
            Console.ReadKey();
        }
    }


A.X、B.Y都是int 类型的属性,默认值为0;
程序执行到A.X的时候,因为没有A对象,所以先调用构造函数A(){X=B.Y+1;} ,这里遇到B.Y
程序运行遇到B.Y,因为没有B对象,所以调用构造函数B(){Y=A.X+1;}  因为A已经存在,所以调用A.X=0;则Y=0+1 ;     ->  得到B.Y=1;
将B.Y=1;返回A(){X=B.Y+1;},得出结果A.X=2;   A.X运行结束,
程序运行到B.Y,因为B对象已经存在,所以直接调用B.Y=1;

打印出最后结果:x=2,y=1
作者: 黑马-杨鹏立    时间: 2013-3-19 13:33
class A
    {
        public static int X;
        static A()
        {
            X = B.Y + 1;
        }
    }
    class B
    {
        public static int Y ;
        static B()
        {
            Y = A.X + 1;
        }
        static void Main()
        {
            Console.WriteLine("x={0},y={1}",A.X,B.Y);
            Console.ReadKey();
        }
    }

这里要注意的是类的调用,看到的是类名和“方法名”一样。所以会照成误解。。。。
但是关注一他的”方法“
static A()
        {
            X = B.Y + 1;
        }
其实这是重写了他的构造函数,如不重写系统自动调用无参构造函数。。。
既然重写了无参构造函数,当调用类时会自动调用构造函数执行结果A.X=2,B.Y=1
作者: 黑骏马    时间: 2013-9-4 22:25
这是黑马的面试题吗?看楼主说的意思是去找工作的面试?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2