面向C#程序员的高级Java主题
我是一名为Android编写Java的C#程序员,对Java的一些技术细节我还不确定,我担心我会从C#的角度来理解:面向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#大致相同
- 方法中的参数是否以与C#相同的方式传递?(复制用于引用类型)
- 为什么突然出现了@Override属性(我认为是Java1.5+?)
- 如果您正在使用的某个库缺少依赖项,如何编译应用程序
- 我是否需要担心使用+=进行大字符串连接(例如,改用StringBuilder)
- Java是否有运算符重载:我应该默认使用
或==吗。基本上是object.equals,与C#大致相同(值类型的反射,引用类型的地址引用)equals()
- 是的,在Java中参数总是按值传递的。其中包括复制的引用(而不是复制的对象)。请注意,Java没有任何等价的
或ref
out
- @重写允许您在编译时捕获打字错误,就像C中的“重写”修饰符一样#
- 您只能针对正在使用的库编译应用程序。没有可传递的依赖项检查,就像.NET中没有一样
- 是的,您应该避免在循环中连接字符串,就像在.NET中一样。不过,单语句连接是很好的,就像在.NET中一样,编译器将在编译时执行常量表达式的连接,字符串文本将被插入
- 不,Java没有用户定义的运算符重载。Java中没有自定义值类型;==始终比较基元值或引用。(如果你比较一个
对象
引用和一个原语值,就会涉及到自动装箱/取消装箱,我永远记不起这是怎么回事。不过我认为这是个坏主意。)
不,它没有运算符重载。关于字符串连接,我认为这取决于是否将静态字符串添加到一起,或者是否合并变量。对于变量,最好使用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;