我熟悉java中的引用概念,但看到这段代码后我很困惑
public class App
{
public static void main( String[] args )
{
Test t1 = new Test(1);
Test t2 = new Test(8);
App.doSomething(t1, t2);
System.out.print(t1.a);
System.out.print(t2.a);
}
public static void doSomething(Test t1, Test t2){
System.out.print(t1.a++);
System.out.print(t2.a++);
t1 = new Test(999);
t2 = new Test(888);
}
}
Run Code Online (Sandbox Code Playgroud)
打印:
1
8
2
9
Run Code Online (Sandbox Code Playgroud)
为什么主函数中"t1.a"和"t1.b"的值不变为888和999?
我正在查看一些旧问题进行测试,但我遇到了一个非常简单的问题,但这不是我的预期.
public class Exampractice {
public static void f(int x, int[] y, int[] z) {
x = 2;
y[0] = x;
z = new int[5];
z[0] = 555;
}
public static void main(String[] args) {
int x = 111;
int[] y = {222, 333, 444, 555};
int[] z = {666, 777, 888, 999};
f(x, y, z);
System.out.println(x);
System.out.println(y[0]);
System.out.println(z[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
该问题询问以下代码的结果是什么.我得到以下结果:
111
2
666
Run Code Online (Sandbox Code Playgroud)
我理解为什么x是111,因为局部变量覆盖所有其他变量,y [0] = 2,因为代码说它等于x,这是2,但我迷失了为什么z [0] = 666,因为它已在f中重新排列类.
我有一个模型:fase.java,带有整数和字符串+ getter 和 setter:
public class Fase implements Serializable {
private Integer age;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
我想将整数和字符串存储在数组或数组列表中。我现在用这个:
public String[] getAllValues(){
String[] values = {age.toString(), name};
return values;
Run Code Online (Sandbox Code Playgroud)
然后在 dataServiceImpl.java 中,我使用以下命令检索数据:
user.getFase().getAllValues()[0];
Run Code Online (Sandbox Code Playgroud)
并检索年龄。
这是可行的,但我有的不仅仅是年龄和姓名,并且正在考虑是否可以将 Fase.java 中的所有内容放入一个 Array/ArrayList 中,因为它们是 Integer 和 String,然后在 dataServiceImpl.java 中检索它?
Fase.java 中是这样的:ArrayList <Objects> f3Values = new ArrayList <Objects>();
或者Fase [] f3Array = new Fase[34];
然后使用以下命令在 dataServiceImpl.java 中检索它:ArrayList<Fase3.Fase3Array> f3List = new ArrayList<Fase3.Fase3Array>();
并使用类似:user.f3List[0];?
我准备参加OCJP考试,我有一个棘手的问题.我不知道为什么正确的答案是下一个:"B.300-300-100-100-100"问题听起来像这样:
1. class Foo {
2. private int x;
3. public Foo(int x) {
4. this.x = x;
5. }
6. public void setX(int x) {
7. this.x = x;
8. }
9. public int getX() {
10. return x;
11. }
12. }
13. public class Gamma {
14. static Foo fooBar(Foo foo) {
15. foo = new Foo(100);
16. return foo;
17. }
18. public static void main(String[] args) {
19. Foo foo = new Foo(300);
20. System.out.println(foo.getX() …Run Code Online (Sandbox Code Playgroud) 几个月后我开始学习Java课程,并且我正在尝试制作一个简单版的口袋妖怪游戏.到现在为止一切都很顺利,但现在我遇到了麻烦.
我的地图有障碍存储在Array(私有)中的类中,并使用get方法在其他类中使用Array.不知何故,这些其他类在第一个类中更改了Array.
这怎么可能?
我了解到在Java和C中,您可以分配指针,将指针传递给方法,跟随方法中的指针并更改指向的数据.但是,您无法更改指针指向的位置.
我认为由于它的传递引用功能,我可以在C++中看到不同的行为,但我的代码似乎同意上述声明......
void reassign(string & a);
int main()
{
string x = "abcd";
cout <<"x is " << x <<" at " << &x <<endl; //"x is abcd at 0x7bc7ebd5b720"
reassign(x);
cout <<"x is " << x <<" at " << &x <<endl; //"x is efgh at 0x7bc7ebd5b720"
}
void reassign(string & a)
{
a = string("efgh");
}
Run Code Online (Sandbox Code Playgroud)
由于"string()"构造一个新字符串,为什么"重新分配"函数不会改变原始字符串的地址?
在Cracking the Coding Interview Linked List问题中:编写代码以从未排序的链表中删除重复项,解决方案是
public static void deleteDups (LinkedListNode n){
Hashtable table = new Hashtable();
LinkedListNode previous = null;
while(n!=null){
if(table.containsKey(n.data)){
previous.next = n.next;
} else {
table.put(n.data, true);
previous = n;
}
n = n.next;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么不n = n.next改变传递给函数的链表,但是做previous.next = n.next和previous = n确实改变了传入的链表?
我知道java是通过引用传递的,但仅适用于Java对象.但是为什么它不适用于Java Wrapper类?包装类如Integer,Float,Double是通过引用传递还是通过值传递?因为每当我在方法中传递此类的对象并且更改某些值时,但在该方法之外我没有获得更新的值.
我想在某个类中存储对变量的引用,并在此类中对其进行操作.操作应该修改原始变量.特别是下面的代码应该打印1而不是0.
class Test {
private Long metric;
public Test(Long m) {
this.metric = m;
++this.metric;
}
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Long metric = 0L;
Test test = new Test(metric);
System.out.println(metric);
}
}
Run Code Online (Sandbox Code Playgroud)
如何实现这种行为?