定义了一个静态内部类,创建了两个实例,然后修改其中一个实例的变量时,不知道为什么另一个的变量也被修改了
写的是洛谷的p1746离开中山路
https://www.luogu.com.cn/problem/P1746
发现在赋值操作后temp的hashcode会变的和t的一样
谢谢各位
package prac;
import java.util.Scanner;
public class bfs_1 {
//col表示该节点在哪列 line表示在哪行
static class nod{
int col;
int line;
}
public static int n,x1,x2,y1,y2;//对应题目的各变量
public static int [][]map=new int[10001][10001];//记录地图
public static int [][]distance=new int[1001][1001];//记录每个节点花费的距离,bfs
public static nod[]queue=new nod[1000];//手动实现bfs使用的队列,下面的是头尾
public static int rear=0,front=0;
public static int[] dx=new int[]{0,1,-1,0};//方向数组
public static int[] dy=new int[]{1,0,0,-1};
public static int to_int(char c) {//输入处理
return (int)(c-'0');
}
public static int bfs(int x,int y) {
bfs_1.nod temp=new bfs_1.nod();
bfs_1.nod t= new bfs_1.nod();
temp.col=x;
temp.line=y;
queue[rear++]= temp;
int a,b,dis=0;
distance[y1][x1]=0;
while(rear!=front) {
temp=queue[front++];
dis=distance[temp.line][temp.col];
for(int i=0;i<4;i++) {
a=temp.col+dx[i];
b=temp.line+dy[i];
if(a<1||a>n||b<1||b>n||map[b][a]!=0||distance[b][a]>=0) {
continue;
}
//在下面这个赋值操作之后,temp就自动改变hashcode,和t的hashcode就一样了
t.line=b;
t.col=a;
queue[rear++]= t;
distance[b][a]=dis+1;
}
}
return distance[y2][x2];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
n=scanner.nextInt();
String tempString;
for(int i=1;i<=n;i++) {
tempString=scanner.next();
for(int j=1;j<=n;j++) {
map[i][j]=to_int(tempString.charAt(j-1));
distance[i][j]=-1;//先将距离都赋值-1
}
}
x1=scanner.nextInt();
y1=scanner.nextInt();
x2=scanner.nextInt();
y2=scanner.nextInt();
System.out.println(bfs(x1, y1));
}
}
静态类为什么可以创建实例……还是要看一下代码。
可能是你的成员变量是静态的,两个实例共享
或者是你一个对象引用指向了两个变量,也就是其实只有一个对象
静态变量属于类不属于对象
【以下回答由 GPT 生成】
问题:Java如何修改一个静态内部类实例的参数,而不影响另一个实例的参数?
解决方案:
首先需要了解静态内部类的特性。静态内部类是嵌套在外部类中的一个静态类,可以直接通过外部类名访问,不需要外部类的实例。静态内部类的实例与外部类的实例是独立的。
如果你发现修改一个静态内部类实例的参数会影响到另一个实例的参数,那可能是因为这些参数是静态属性,而不是实例属性。静态属性是类级别的属性,所有实例共享。
如果要确保只修改一个静态内部类实例的参数,需要将这些参数改为实例属性而不是静态属性。这样每个实例都有独立的属性,并且修改一个实例的属性不会影响其他实例。
下面是一个示例的代码:
public class OuterClass {
public static class StaticInnerClass {
private int instanceVariable;
public int getInstanceVariable() {
return instanceVariable;
}
public void setInstanceVariable(int value) {
instanceVariable = value;
}
}
public static void main(String[] args) {
StaticInnerClass instance1 = new StaticInnerClass();
StaticInnerClass instance2 = new StaticInnerClass();
instance1.setInstanceVariable(10);
instance2.setInstanceVariable(20);
System.out.println("instance1: " + instance1.getInstanceVariable());
System.out.println("instance2: " + instance2.getInstanceVariable());
}
}
输出结果:
instance1: 10
instance2: 20
在这个示例中,我们将参数instanceVariable定义为实例属性而不是静态属性。每个实例都有独立的instanceVariable,并且修改一个实例的值不会影响到其他实例。
希望能对你有所帮助!如果还有任何问题,请随时提问。
【相关推荐】