我试着寻找答案但没有成功。如果我从中派生的类包含在jar中会改变大小,我是否需要重建代码?顺便说一下,我是java的新手。
我非常肯定在C ++中答案是肯定的。我认为C ++中的'new'包含一个malloc(),然后是对构造函数的调用。如果类的大小我来自二进制文件中的变化,我将需要重新编译我的源代码,以便编译器知道我从中派生的类的新大小,否则将分配不足的内存。
[以示例编辑]
忍受我,因为我不熟悉java。忽略任何语法错误。希望我能让这个例子足够接近我的观点。
public class MyClass extends 3rdPartyClass
{
...
}
public class OneOfMyClasses
{
public void Foo()
{
MyClass mc = new MyClass(); <-- allocation needs to happen here
}
}
在3rdParty jar文件中:
public class 3rdPartyClass
{
private int int1;
private int int2;
...
}
现在在3rdPartyClass中进行了更改。他们添加了更多实例成员:
public class 3rdPartyClass
{
private int int1;
private int int2;
private int int3;
...
}
还有一个int,因此当MyClass的分配发生时,它需要从x字节更改为x + sizeof(int)字节。分配(malloc?)是否在我的代码中发生?在C ++中,malloc发生在我的代码中,然后调用构造函数。因此,即使我没有更改任何内容,我的代码也必须重新编译,以便可以分配正确的字节数。只是想知道它在java中是如何工作的。
谢谢, 尼克
答案 0 :(得分:1)
如果我理解正确,不。如果你使用的jar / lib改变了实现/代码,你就不必重建你自己的类,这些类是从它们扩展而来的。
如果lib更改公共成员,则必须重新编译。
虽然有一些陷阱,但我没有记错。但总的来说,我建议总是重新编译你的代码。
Java程序始终使用标准Java API类和接口,它们是普通jar中的普通类。如果您使用来自一个供应商的实现分发一个软件罐,您可以让它针对来自其他供应商的实现运行。这是Java的一个非常重要的方面,如果扩展类使用一个实现的内存使用细节,这将无法工作。字节码编译完全没有这些东西。