我有一个操作复数的任务。每个数字由双r =实部,双i =虚部和字符串名组成。名称必须在构造函数中设置,所以我创建了int计数器,然后我将其值发送到setNextName函数并返回名称字母。不幸的是,增加这个'计数器'值只能在costructor中工作,然后再次设置为0.如何处理?一些常量值?第二个问题是我还需要提供setNextNames(char c)函数来改变计数器当前值。
代码:
public class Imaginary {
private double re;
private double im;
private String real;
private String imaginary;
private String name;
private int counter=0;
public Imaginary(double r, double u){
re = r;
im = u;
name = this.setNextName(counter);
counter++;
}
public static String setNextName(int c){
String nameTab[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N",
"O","P","Q","R","S","T","U","W","V","X","Y","Z"};
String setName = nameTab[c];
System.out.println("c: "+c);
return setName;
}
public static String setNextName(char c){
//
//don't know how to deal with this part
//
}
答案 0 :(得分:4)
很难说出你在做什么,但我怀疑这会解决你当前的问题:
private static int counter = 0;
答案 1 :(得分:2)
你应该counter
静态。
您还应该使nameTab
成为私有静态字段,然后在setNextName()
中,您可以遍历它以查找与给定字符对应的名称,并获取其索引。 (在纯ASCII世界中,当然可以通过从给定字符中减去'A'的数值来简单地计算索引,但我不太确定如何使用Java,在Unicode中,使用疯狂的输入 - 迭代是安全的。)
答案 2 :(得分:1)
在OO语言中,通常有两种类型的变量进入类:
给定一个类:
public class Person
{
// class variable
private static int numberOfEyes;
// instance variable
private String name;
// other code goes here
}
如果您要做类似的事情:
Person a = new Person("Jane Doe");
Person b = new Person("John Doe");
然后执行以下操作:
a.setName("Jane Foe");
Person“a”的名称会改变,但Person“b”的名称会保持不变。
如果你早上醒来并决定要三只眼睛:
Person.setNumberOfEyes(3);
然后人“a”和人“b”以及其他每个人的例子都会突然有3只眼睛。
您想在计数器声明中添加“静态”。
答案 3 :(得分:1)
是你的代码被多个线程使用,而不是我建议使反制静态不会解决你的问题。
你需要特别注意实现线程同步使用lock关键字,如下所示。
private static readonly obj = new Object();
private static int counter =0;
public Imaginary(double r, double u)
{
re = r;
im = u;
lock(obj)
{
name = this.setNextName(counter);
counter++;
}
}
这样可以在增加计数器的同时确保线程安全(还有其他方法可以提供线程安全性,但这个方法的代码最少)。
答案 4 :(得分:0)
由于字段counter
不是static
,因此每个对象都有自己的计数器。