这些java类是等价的吗?

这些java类是等价的吗?,java,class,equivalent,Java,Class,Equivalent,给定以下两个类示例1和示例2,并且排除所有性能特征,这两个类的操作方式是否完全相同。也就是说,无论methodA或methodB是或可能是多么简单或复杂,在所有可能的条件下(包括内部和外部),运行这两个类的结果总是绝对相同的吗 例1 例2 是的,它们是一样的。基本上,问题是这两件事是否相等: if (t) { methodA(); methodB(); } 及 它们是相同的,因为t不能在方法调用之间

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

例1 例2
是的,它们是一样的。基本上,问题是这两件事是否相等:

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


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

是的,它们是一样的。基本上,问题是这两件事是否相等:

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


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

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


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

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


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

它们是相同的。两个类中的if语句相同

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

结果不能保证绝对相同,尽管通常情况下是一样的。具体来说,您可以编写一个
methodA
methodB
实现,当在
Example1
Example2
中运行时,即使主程序的类名在执行前相同,也会产生不同的结果

实现这一点的一种方法是生成堆栈跟踪,然后对行号进行内省,以执行
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);
}
例如,在
Example1
Example2
中运行时,下面的方法B将导致不同的输出

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

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

    System.out.println(count);
}

然而,一般来说,程序将产生相同的结果,因为这种基于堆栈跟踪或其他类似方面的逻辑类型是不寻常的。

结果不能保证绝对相同,尽管通常情况下它们是相同的。具体来说,您可以编写一个
methodA
methodB
实现,当在
Example1
Example2
中运行时,即使主程序的类名在执行前相同,也会产生不同的结果

实现这一点的一种方法是生成堆栈跟踪,然后对行号进行内省,以执行
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);
}
例如,在
Example1
Example2
中运行时,下面的方法B将导致不同的输出

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

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

    System.out.println(count);
}

但是,一般来说,程序将产生相同的结果,因为这种基于堆栈跟踪或其他类似方面的逻辑是不常见的。

是的,它们将提供相同的输出。您基本上是问
if
语句在Java语言中是否可靠工作?我要说的是,这取决于你所说的“同样的方式”是什么意思。由于
Random.nextBoolean
调用引入的随机性,两次执行不一定会产生相同的结果。但是,它们都遵循相同的执行路径,因为它们都将以相同的顺序对相同的变量执行相同的操作,只是
Random
引入了可变性,因为种子发生了变化(这是输入之一)。是的,它们将给您相同的输出。您基本上是问
if
语句在Java语言中是否可靠地工作?我要说的是,这取决于你所说的“同样的方式”是什么意思。由于
Random.nextBoolean
调用引入的随机性,两次执行不一定会产生相同的结果。然而,它们都遵循相同的执行路径,因为它们都将以相同的顺序对相同的变量执行相同的操作,只是
Random
引入了可变性,因为种子发生了变化(这是输入之一)。我觉得重要的是要注意,如果
t
是,一个方法调用——这两个方法将不同。撇开性能不谈,一个调用
if
语句的方法两次,另一个调用一次。如果所讨论的方法确实做了一些事情,这是一个非常重要的区别。我觉得重要的是要注意,如果
t
是一个方法调用,那么它们就不一样了。撇开性能不谈,一个调用
if
语句的方法两次,另一个调用一次。这是一个非常重要的区别,如果所讨论的方法确实做了一些事情;尽管如此,我们仍然可以从
System.out.println(count)获得相同的输出如果代码在
Example1
中被写成
if(t){methodA();methodB();}
if(t){methodA();}如果(t){methodB();}
Example2
中。然而,可以说,我的原始问题并不是与这些陈述一起在一行中提出的。@user2512399是的,非常正确。但是,即使这样,您也可以通过从磁盘读取类文件并基于原始字节执行某些操作来进行区分,假设编译器没有优化并生成相同的字节代码。我只是在你要求绝对保证后才发布了这个答案,