1

给定以下 2 个类 Example1 和 Example2 并排除所有性能特征,这两个类的操作方式是否完全相同。也就是说,无论 methodA 或 methodB 多么简单或复杂,在所有可能的条件下(内部和外部)运行这两个类的结果是否总是完全相同

示例 1

public class Example1
{
    public static void main (String [] args)
    {
        try
        {   
            // this will not compile since nextBoolean() is not static
            // boolean t = java.util.Random.nextBoolean();

            // changed to
            java.util.Random r = new java.util.Random();
        boolean t = r.nextBoolean();

            if (t)
            {
                methodA();
                methodB();
            }
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.out);
        }
    }

    private static void methodB ()
    {
        // code goes here
    }

    private static void methodA ()
    {
        // code goes here
    }
}

示例 2

public class Example2
{
    public static void main (String [] args)
    {
        try
        {   
            boolean t = java.util.Random.nextBoolean();

            if (t)
            {
                methodA();
            }

            if (t)
            {
                methodB();
            }
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.out);
        }
    }

    private static void methodB ()
    {
        // code goes here
    }

    private static void methodA ()
    {
        // code goes here
    }
}
4

4 回答 4

4

是的,它们是一样的。基本上问题是问这两个东西是否相等:

        if (t)
        {
            methodA();
            methodB();
        }

        if (t)
        {
            methodA();
        }

        if (t)
        {
            methodB();
        }

它们是相同的,因为t在方法调用之间不能改变。

于 2013-07-10T19:41:38.873 回答
3

是的,它们会产生相同的输出。变量t不能被方法改变,所以不可能methodA阻止methodB执行。

同样,如果methodA抛出异常,methodB在任何一种情况下都不会执行。

于 2013-07-10T19:41:58.880 回答
1

保证结果绝对相同,但一般情况下会如此。具体来说,您可以编写一个methodAandmethodB实现,当在Example1and中运行时会产生不同的结果Example2,即使在执行之前主程序的类名是相同的。

实现此目的的一种方法是生成堆栈跟踪,然后自省执行的行号,这在和methodB中是不同的。Example1Example2

例如,下面的 methodB 在Example1和中运行时会产生不同的输出Example2

public static void methodB()
{
    int count = 0;

    StackTraceElement[] elements = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : elements)
    {
        count += element.getLineNumber();
    }

    System.out.println(count);
}

但是,通常程序会产生相同的结果,因为这种基于堆栈跟踪或其他此类方面的逻辑是不寻常的。

于 2013-07-10T20:44:10.047 回答
0

他们是一样的。if 语句在两个类中是相同的。

于 2013-07-10T19:44:09.157 回答