考虑以下代码:
public class Program
{
private static void Main(string[] args)
{
var person1 = new Person { Name = "Test" };
Console.WriteLine(person1.Name);
Person person2 = person1;
person2.Name = "Shahrooz";
Console.WriteLine(person1.Name); //Output: Shahrooz
person2 = null;
Console.WriteLine(person1.Name); //Output: Shahrooz
}
}
public class Person
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
很显然,当分配person1
到person2
与Name
物业person2
发生变化,Name
中person1
也将改变.person1
并person2
有相同的参考.
为什么何时person2 = null
,person1
变量也不会为空?
我一直在调试我的Game of Life的实现,我的主要问题看起来就像是我使用数组的方式.
public boolean[][] oldState;
public boolean[][] newState;
private boolean gameState = true;
public LifeBoard(Seed seed) {
oldState = seed.getSeed();
newState = new boolean[oldState.length][oldState[0].length];
run();
}
public void run() {
//debug code to run for x generations
for (int i = 0; i < 5; i++) {
BoardPrinter.print(oldState);
evaluateCells();
oldState = newState;
}
BoardPrinter.print(oldState);
System.out.println("game over");
}
Run Code Online (Sandbox Code Playgroud)
Seed的boolean [] []为5x5网格,除中间行的3个水平中间单元外全部为假(死)
00000
00000
0+++0
00000
00000
Run Code Online (Sandbox Code Playgroud)
evaluateCells()查看网格中的每个单元格,查看它周围的8个单元格,对它们进行计数,并根据邻居数量将新值写入newState.
应该发生什么:使用oldState计算newState,将newState复制到oldState,然后返回newState,再根据新的oldState写入每个单元格.
真正发生了什么:第一代正常工作,但之后结果越来越奇怪,它评估单元格是假的,我知道是真的,等等.问题似乎是我复制数组的方式.
如果我初始化第3个空白数组blankState [] [] = new boolean [5] [5]; 并且在运行循环期间说:
public void …
Run Code Online (Sandbox Code Playgroud) 我已经在这里问了一个矛盾问题 为什么这不会抛出NullPointerException?
但这是我想知道的不同类型和行为之一,请查看下面的示例
package com;
public class test {
public static void main(String[] args) {
Abc abc = null;
//Scenario 1
System.out.println("ERROR HERE " + abc!=null?abc.getS1():""); //This is throwing null pointer exception
//Scenario 2
String s1 = abc!=null?abc.getS1():"";
System.out.println("This is fine " + s1);
}
}
class Abc {
String s1;
public String getS1() {
return s1;
}
public void setS1(String s1) {
this.s1 = s1;
}
}
Run Code Online (Sandbox Code Playgroud)
所以在这里,场景2可以正常工作但是当我在场景1中使用其他字符串连接尝试它时它为什么不起作用?