给定以下2个类Example1和Example2并排除所有性能特征,这两个类的操作方式是否完全相同。也就是说,无论方法A或方法B是多么简单或复杂,在所有可能的条件(内部和外部)下运行这两个类的结果总是绝对是相同 ?
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
}
}
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
}
}
答案 0 :(得分:4)
是的,他们是一样的。基本上问题是问这两件事是否相等:
if (t)
{
methodA();
methodB();
}
和
if (t)
{
methodA();
}
if (t)
{
methodB();
}
它们是相同的,因为t
在方法调用之间无法更改。
答案 1 :(得分:3)
是的,它们会产生相同的输出。变量t
不能被方法更改,因此methodA
不可能阻止methodB
执行。
同样,如果methodA
抛出异常,methodB
将不会执行任何一种情况。
答案 2 :(得分:1)
结果不保证完全相同,尽管一般情况下都是如此。具体来说,您可以编写methodA
和methodB
实现,这些实现在Example1
和Example2
中运行时会产生不同的结果,即使主程序的类名是执行前一样。
实现此目的的一种方法是生成堆栈跟踪,然后内省执行methodB
的行号,这在Example1
和Example2
中是不同的。
例如,以下方法B在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);
}
但是,通常程序会产生相同的结果,因为这种基于堆栈跟踪或其他方面的逻辑是不常见的。
答案 3 :(得分:0)
他们是一样的。这两个类中的if语句是相同的。