Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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
面向C#程序员的高级Java主题_C#_Java_Pass By Reference - Fatal编程技术网

面向C#程序员的高级Java主题

面向C#程序员的高级Java主题,c#,java,pass-by-reference,C#,Java,Pass By Reference,我是一名为Android编写Java的C#程序员,对Java的一些技术细节我还不确定,我担心我会从C#的角度来理解: 方法中的参数是否以与C#相同的方式传递?(复制用于引用类型) 为什么突然出现了@Override属性(我认为是Java1.5+?) 如果您正在使用的某个库缺少依赖项,如何编译应用程序 我是否需要担心使用+=进行大字符串连接(例如,改用StringBuilder) Java是否有运算符重载:我应该默认使用equals()或==吗。基本上是object.equals,与C#大致相同

我是一名为Android编写Java的C#程序员,对Java的一些技术细节我还不确定,我担心我会从C#的角度来理解:

  • 方法中的参数是否以与C#相同的方式传递?(复制用于引用类型)
  • 为什么突然出现了@Override属性(我认为是Java1.5+?)
  • 如果您正在使用的某个库缺少依赖项,如何编译应用程序
  • 我是否需要担心使用+=进行大字符串连接(例如,改用StringBuilder)
  • Java是否有运算符重载:我应该默认使用
    equals()
    或==吗。基本上是object.equals,与C#大致相同(值类型的反射,引用类型的地址引用)
按顺序回答:

  • 是的,在Java中参数总是按值传递的。其中包括复制的引用(而不是复制的对象)。请注意,Java没有任何等价的
    ref
    out
  • @重写允许您在编译时捕获打字错误,就像C中的“重写”修饰符一样#
  • 您只能针对正在使用的库编译应用程序。没有可传递的依赖项检查,就像.NET中没有一样
  • 是的,您应该避免在循环中连接字符串,就像在.NET中一样。不过,单语句连接是很好的,就像在.NET中一样,编译器将在编译时执行常量表达式的连接,字符串文本将被插入
  • 不,Java没有用户定义的运算符重载。Java中没有自定义值类型;==始终比较基元值或引用。(如果你比较一个
    对象
    引用和一个原语值,就会涉及到自动装箱/取消装箱,我永远记不起这是怎么回事。不过我认为这是个坏主意。)
是否传入方法中的参数 与C#相同的方式?(复制供参考) 参考类型)

所有灵长类类型都被复制,所有对象实际上都是指向对象的指针,指针被复制,但实际对象没有被复制

为什么有@Override属性 突然出现了(我想是Java) 1.5+?)

它没有,因为Java1.6还可以使用它来显示一个方法正在实现一个接口。@Override允许您向编译器指示您认为您正在重写一个方法,当您没有重写时,编译器会警告您(这实际上非常有用,特别是在超类发生更改时)

如何能够编译一个 应用程序,如果您缺少 其中一个库的依赖项 你在用什么

我想不是

我是否需要担心将+=用于 大字符串连接(例如,使用 而不是StringBuilder)

在某些情况下。java编译器+VM非常擅长为您自动使用StringBuilder。然而,它并不总是这样做。我不会事先对此(或任何事情)进行优化

Java是否有运算符重载: 我应该使用equals()还是==by 违约基本上是object.equals 大致与C#(反射)相同 值类型,的地址引用 参考类型)


不,它没有运算符重载。

关于字符串连接,我认为这取决于是否将静态字符串添加到一起,或者是否合并变量。对于变量,最好使用StringBuilder.:)

因此:

很好

但在这里,使用StringBuilder更好

String s = "A";
s += variable_b;
s += variable_c;

即使是第一个示例也会创建许多对象。。。我的意思是,如果字符串是静态的,您应该执行
s=“A”+“B”+“C”
@Petar No,使用
s=“A”.concat(“B”).concat(“C”)或
s=new StringBuilder().append(“A”).append(“B”).append(“C”).toString()
(尽管后者可能与编译器为您的代码创建的字符串是等效的)
String s=“A”+“B”+“C”
创建与
String s=“ABC”
(最快)等效的字节码。他用
+=
给出的示例将为每个
+=
创建一个新的StringBuilder(显然要慢得多)。@seanizer AFAIK编译器将“a”+“B”+“C”优化为“ABC”,正如Andrei所说。好吧,对不起,我的意思当然是
s=a.concat(B)。concat(C)
,其中ab和C不是编译时间常数。是的,我知道我错过了静态部分编译过程中遇到的特殊问题(可能与Dalvik有关)是我的应用程序缺少对javax.activation的引用,这是GData库的MediaStreamSource类所需的。应用程序已编译并运行,但当GData库首次使用该类时,该应用程序就中断了。@Chris:当然。。。但同样的事情也可能发生在C。(事实上,今天早上就有一个问题…)对于一个公共类型,我发誓它会在C#中生成一个编译错误。我没有多少次在C#中遇到过这个问题,不过,我现在必须尝试一下。@Chris S:我相信,如果依赖库中的类型用于您从中间库使用的公共API中,则会产生错误。基本上,如果使用类,编译器需要理解该类中的所有内容。
String s = "A";
s += variable_b;
s += variable_c;