我希望有人可以为我澄清这里发生的事情.我在整数类中挖了一下但因为整数覆盖了+运算符我无法弄清楚出了什么问题.我的问题在于这一行:
Integer i = 0;
i = i + 1; // ? I think that this is somehow creating a new object!
Run Code Online (Sandbox Code Playgroud)
这是我的推理:我知道java是通过值传递(或通过引用值传递),所以我认为在下面的示例中,每次都应该递增整数对象.
public class PassByReference {
public static Integer inc(Integer i) {
i = i+1; // I think that this must be **sneakally** creating a new integer...
System.out.println("Inc: "+i);
return i;
}
public static void main(String[] args) {
Integer integer = new Integer(0);
for (int i =0; i<10; i++){
inc(integer);
System.out.println("main: "+integer);
} …Run Code Online (Sandbox Code Playgroud) 在学习新的编程语言时,您可能遇到的一个可能的障碍是,默认情况下,该语言是按值传递还是按引用传递.
所以这是我对你们所有人的问题,用你最喜欢的语言,它是如何实际完成的?什么是可能的陷阱?
language-agnostic oop parameters pass-by-reference pass-by-value
java.util.Calendar.clone()返回"...具有相同属性的新日历"并返回"此日历的浅表副本".
为回答这并不似乎是一个浅拷贝这里的SO.这个问题被标记为与语言无关, Java似乎不遵循语言无关的定义.当我单步执行代码时,我注意到结构和元素被复制到这个新对象,而不仅仅是语言无关的结构.
在Java中,什么是浅拷贝?
它与Java深层副本(如果存在)有何不同?
可能重复:
Java是"传递引用"吗?
我今天发现了一种不寻常的Java方法:
private void addShortenedName(ArrayList<String> voiceSetList, String vsName)
{
if (null == vsName)
vsName = "";
else
vsName = vsName.trim();
String shortenedVoiceSetName = vsName.substring(0, Math.min(8, vsName.length()));
//SCR10638 - Prevent export of empty rows.
if (shortenedVoiceSetName.length() > 0)
{
if (!voiceSetList.contains("#" + shortenedVoiceSetName))
voiceSetList.add("#" + shortenedVoiceSetName);
}
}
Run Code Online (Sandbox Code Playgroud)
根据我读过的有关Java传递变量,复杂对象的行为的一切,这段代码应该什么都不做.所以嗯......我在这里错过了一些东西吗?是否有一些微妙的东西丢失在我身上,或者这些代码是否属于thedailywtf?
作为一个程序员,我认为这些是寻找像"java.lang.Object中的地址1a234552"或类似的相似s的
Object s = "hello";
Run Code Online (Sandbox Code Playgroud)
它是否正确?因此所有引用都是固定大小的?
可能重复:
Java强制转换操作符如何工作?
Java强制实现
我总是想知道如何使用Java进行对象转换.我理解原始类型它会更像二进制表示级别,但是对象呢?有点像Polymorphism或者dynamic binding在某种程度上会在运行时确定一切吗?例如:
class Parent{
void A(){}
}
class Child extends Parent{
@Override
void A(){}
}
Parent p = new Parent();
Child c = (Child) p;
Run Code Online (Sandbox Code Playgroud)
这是如何在幕后工作的?它是否创建了一个新实例Child?而且,如果你试图施放会发生什么:
Child b = (Child) new Object();
Run Code Online (Sandbox Code Playgroud)
最后一个,在将一个原语转换为包装类时:
Double d = (Double) 3.3;
Run Code Online (Sandbox Code Playgroud)
我知道你没有必要施展它,但如果你这样做呢?在后端发生了什么重大事件?
当return;try块中存在try-finally执行时,我感到困惑.根据我的理解,finally块将始终执行,即在返回调用方法之前.在考虑以下简单代码时:
public class TryCatchTest {
public static void main(String[] args){
System.out.println(test());
}
static int test(){
int x = 1;
try{
return x;
}
finally{
x = x + 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印的结果实际上是1.这是否表示finally块未执行?任何人都可以帮助我吗?
我有以下代码:
public class Main {
static void swap (Integer x, Integer y) {
Integer t = x;
x = y;
y = t;
}
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
swap(a, b);
System.out.println("a=" + a + " b=" + b);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望它打印a = 2 b = 1,但它打印相反.显然交换方法不会交换a和b值.为什么?
这2个代码有什么区别:
代码A:
Foo myFoo;
myFoo = createfoo();
Run Code Online (Sandbox Code Playgroud)
哪里
public Foo createFoo()
{
Foo foo = new Foo();
return foo;
}
Run Code Online (Sandbox Code Playgroud)
比.代码B:
Foo myFoo;
createFoo(myFoo);
public void createFoo(Foo foo)
{
Foo f = new Foo();
foo = f;
}
Run Code Online (Sandbox Code Playgroud)
这2个代码之间有什么区别吗?
java terminology parameter-passing pass-by-reference pass-by-value
java ×8
casting ×1
clone ×1
finally ×1
integer ×1
kotlin ×1
oop ×1
parameters ×1
polymorphism ×1
shallow-copy ×1
terminology ×1
try-catch ×1