可能重复:
Java是"传递引用"吗?
数组在Java 中不是原始类型,但它们也不是对象,它们是通过值还是通过引用传递的?它取决于数组包含的内容,例如引用或基本类型吗?
我已经研究过java是通过引用传递但是当我执行下面的代码时,字符串在主方法中没有交换为什么?
static void swap(String s1, String s2){
String temp = s1;
s1=s2;
s2=temp;
}
public static void main(String[] args) {
String s1 = "Hello", s2 = "world";
swap(s1, s2);
System.out.println(s1 + s2);
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码,它有
一个可变的Person类,String和一个修改String和Person实例的方法
class Person{
int a = 8;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
@Override
public String toString() {
return "Person [a=" + a + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
-
public class TestMutable {
public static void main(String[] args)
{
Person p = new Person();
p.setA(34);
String s = "bar";
modifyObject(s, p); //Call to modify objects
System.out.println(s);
System.out.println(p);
}
private static void modifyObject(String str, Person p)
{
str = "foo";
p.setA(45); …Run Code Online (Sandbox Code Playgroud) java terminology parameter-passing pass-by-reference pass-by-value
首先让我说我不能在这里放任何代码,因为我的笔记本电脑上的互联网不能工作,所以我通过手机发布这个.好吧问题是我说有两个类:第一和第二类.第一类有一个ArrayList属性,它从类2中调用void方法并将其ArrayList作为参数传递.现在该方法初始化另一个方法ArrayList并使其等于我传递的参数并对该新方法进行更改ArrayList.有趣的是,即使我作为参数传递的原始ArrayList也在改变.可能的原因是什么?
说我做以下......
// MyRunnable是我声明的类,它实现了Runnable.
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
r = null;
Run Code Online (Sandbox Code Playgroud)
将r设置为null有什么意义,就像我在上面的代码片段中一样?
我知道这个问题已经解决了很多次 - 但我的Java/C++知识太弱了我几乎无法理解答案:-( ...我真正喜欢的只是一个非常简单的例子.
在C++中,我可以编写以下内容:
void func()
{
int x = 3;
add_one(x);
// now x is 4.
}
void add_one(int &var)
{
var++;
}
Run Code Online (Sandbox Code Playgroud)
我现在想看到的是用java实现相同效果的最简单方法.
我是编程以及本网站的新手,所以如果我搞砸了,请原谅我.我有一点时间搞清楚如何在这里正确发布我的代码.
package tester;
import java.util.*;
public class Mainclass2 {
public static void main(String[] args) {
int y = 3;
int[] x = {1, 2, 3, 4};
editnumbersArray(x);
editnumbersNotArray(y);
System.out.println(x[2]); **//now this was changed from 3 to 9...**
System.out.println(y); //but this one went unchanged.
}
//this accepts 'x[]' into the 'a[]' parameter.
public static void editnumbersArray(int[] a){
a[2] = 9; **//<---why does this one CHANGE the actual x[2] instead of just a[2]?**
}
//this accepts 'y' into the 'a' parameter.
public …Run Code Online (Sandbox Code Playgroud) 有一个问题,了解下面的代码正在发生什么.阵列的行为c,并d为我所期望的那样.但是,这是怎么回事与a和b?(我也尝试使用普通的标量变量,在任何一种情况下都不会发生任何意外.)
输出将复制到RH注释.
import java.util.Arrays;
public class ArraysParadox {
public static void main(String[] args) {
int[] c = {1, 2, 3};
int[] d = {6, 5, 4, 3};
System.out.print("c: ");
System.out.println(Arrays.toString(c)); // c: [1, 2, 3]
System.out.print("d: ");
System.out.println(Arrays.toString(d)); // d: [6, 5, 4, 3]
System.out.println("--- swap ---");
int[] tmp = c;
c = d;
d = tmp; // <----- Magic?
System.out.print("c' (=d): ");
System.out.println(Arrays.toString(c)); // c' (=d): [6, 5, 4, 3]
System.out.print("d' …Run Code Online (Sandbox Code Playgroud) 我有一个字节数组和一个对象引用.
byte[] data = new byte[128];
Block b = new Block();
Run Code Online (Sandbox Code Playgroud)
我想在"data"数组的最后2(或4)个字节中存储引用b .
请注意:我不想序列化对象并存储在字节数组中.我需要存储一个引用新块的指针(引用).
编辑
我的Block类如下
public class Block {
byte[] data ;
public Block(){
data = new byte[128];
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,数据数组将使用126个字节来存储字符串,并使用最后两个(或4个)字节来存储对另一个块的引用.它的链接列表.
我本可以使用Block类的不同定义[通过在类本身中包含对Block的引用]来完成它.但是问题语句指出只有最后2个字节的约束应该用作对另一个块的引用.从其他帖子我开始知道在jvm(32位)中,引用的大小为4个字节.因此我认为它只能使用最后4个字节来完成
来自问题陈述的片段
块的最后2个字节用于指向下一个块.假设文件是8块大小,那么第4块的最后2个字节将指向第5块,第5块的最后2个字节指向第6块,依此类推.
java ×10
arrays ×4
methods ×2
arraylist ×1
byte ×1
memory ×1
parameters ×1
pointers ×1
return-value ×1
runnable ×1
terminology ×1
void ×1