Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java堆栈实现为什么类型的数据?它如何计算每种类型的数据?_Java_Stack_Implementation - Fatal编程技术网

Java堆栈实现为什么类型的数据?它如何计算每种类型的数据?

Java堆栈实现为什么类型的数据?它如何计算每种类型的数据?,java,stack,implementation,Java,Stack,Implementation,这里我指的是java编译器的实际实现: 我猜堆栈实现为C结构,但我真正的意思是: java如何使用这种结构进行计算?例如,如果一个局部变量的类型是string或pointer,而另一个是double或int,java需要对这些变量进行操作,比如说添加两个变量,它是否首先将它们转换为相同的类型,然后添加,然后返回值 会不会大致是这样的: struct var { dataType type; union{ char c; int i;

这里我指的是java编译器的实际实现:

我猜堆栈实现为C结构,但我真正的意思是:

java如何使用这种结构进行计算?例如,如果一个局部变量的类型是string或pointer,而另一个是double或int,java需要对这些变量进行操作,比如说添加两个变量,它是否首先将它们转换为相同的类型,然后添加,然后返回值

会不会大致是这样的:

struct var {
    dataType type;
    union{
        char c;
        int i;
        double d;
        void *p;
    } value;
}
dload_1    // load double A
iload_3    // load int B
i2d        // convert int to double
dadd       // add doubles 
dstore 4   // store result to C 
其中dataType是一些数据类型的枚举

例如:假设变量A是双精度的,变量B是整数,C也是双精度的

C=A+B的字节码是如何生成的?虚拟机如何处理这些不同的数据类型?

浮点(double)和整数是完全不同的数据类型,所有现代处理器都有处理这些数据类型的特殊操作。Java字节码还有一个用于添加浮点的加法操作数(dadd)和一个用于添加整数的加法操作数(iadd)

现在谈谈你的问题:

double A = 1;
int B = 1;
double C = B + A;
由于结果C是双精度的,Java编译器将简单地将B转换为双精度的。字节码看起来像这样:

struct var {
    dataType type;
    union{
        char c;
        int i;
        double d;
        void *p;
    } value;
}
dload_1    // load double A
iload_3    // load int B
i2d        // convert int to double
dadd       // add doubles 
dstore 4   // store result to C 

Java不像C那样自由地强制类型,所以从来没有“以添加字符串和int的方式转换字符串和int”

Java类型系统通常是通过字符串比较来管理的(但是,在一个概念级别上,这类项通常会被优化掉,而这个级别是一个总体简化)

因此,一个方法有一个签名,它在“.class”对象中表示为字符串

public static void main(String[] args) {
  ...
}
我会签名的

main([Ljava.lang.String)V
表示一个名称“main”,它接受类型为“L”的对象的数组“[”,该对象可以强制转换为字符串“java.lang.String”,并且不返回任何内容(空值)“V”

因此,为了查看是否可以在运行时将一组参数传递给该数组,将检查对象的类型,以查看它是否“可分配给”字符串数组。可分配给是一种奇特的说法,它将类型作为超类共享,或将类型作为接口,或其中一个超类将类型作为接口

由于这种类型的类型检查,JVM实际上不会对JVM中的元素使用C样式的类型检查;但是,它会对实现此环境的元素执行C样式的类型检查(如果对您有意义的话)


如果你很好奇,你可以阅读,甚至可以。你会发现Java(由于多态性)在许多情况下不能依赖静态类型检查,因此C编译器类型验证无论如何都不会起作用。

你可以编译一些示例代码并查看字节码……而且,不清楚是什么“添加不同类型的变量”与堆栈的结构有关。您似乎在询问至少三个不相关的主题(Java转换语义、字节码生成和JVM堆栈)。请您将问题编辑成一个主题好吗?有很多关于编译器设计和实现的书籍。我建议您买一本纸质书或做一些在线研究。当您有更具体的问题时,我们当然可以提供帮助。
java是如何用这种结构计算的?
没有,JVM有,这通常是用C或C++编写,我猜它会把堆栈看成是机器字的数组。现代JVM不必在基于登记的体系结构上实际模拟基于堆栈的处理器,它只需要产生等价的结果。同时,你也会问很多不同的问题:)对于原语来说非常正确。对象类型的处理方式完全不同。在问题中只提到了原语。虽然原语只是其中的一部分,但我上次检查的void*到目前为止还不是一个原语,它在Java中映射到的最接近的东西是引用(这对我来说是一个类).我想可能会有其他解释,也许我对这个问题的理解有点不同(在数据结构中更多地关注了工会)。这个问题不是很清楚:)我同意你的看法。很难涵盖所有的基础。