Java 如何将现有过程代码转换为使用类?
我正在尝试学习Java,基本上我的方法是采用我用python学习的过程风格,并将其应用到Java中。因此,我从不使用类,而是将所有内容放在一个包含许多方法的类中(我只是将其用作python函数)。我想我遇到了一个问题,需要咬紧牙关使用类,但我很难思考如何去做 为了简化我的问题(忽略糟糕的设计——这只是为了说明问题),我有一个程序,它接受一个列表,并在for循环中对每个项目进行一些计算(在本例中,列表的值加1)。我只希望它在列表中的2个项目上工作,然后停止(在本例中,它是前2个项目,但在我的实际程序中,它可以在列表中的任何位置)。下面是与我已经在做的工作类似的工作代码: 无课程:Java 如何将现有过程代码转换为使用类?,java,oop,Java,Oop,我正在尝试学习Java,基本上我的方法是采用我用python学习的过程风格,并将其应用到Java中。因此,我从不使用类,而是将所有内容放在一个包含许多方法的类中(我只是将其用作python函数)。我想我遇到了一个问题,需要咬紧牙关使用类,但我很难思考如何去做 为了简化我的问题(忽略糟糕的设计——这只是为了说明问题),我有一个程序,它接受一个列表,并在for循环中对每个项目进行一些计算(在本例中,列表的值加1)。我只希望它在列表中的2个项目上工作,然后停止(在本例中,它是前2个项目,但在我的实际程
public class LearningClasses {
public static void main(String[] args) {
int[] list = new int[]{1,2,3,4,5,6,7,8,9,10};
int[] data_list = new int[list.length];
for (int current_location = 0; current_location<list.length;current_location++) {
for (int i =0; i<100; i++){
if (check_size(data_list) == false ) {
break;
}
data_list[current_location] = (list[current_location]+1);
}
}
//its done now lets print the results
for (Integer item : data_list) {
System.out.println(item);
}
}
private static boolean check_size(int[] data_list) {
// TODO Auto-generated method stub
int count = 0;
for (int item : data_list) {
if (item != 0) {
count++;
if (count>=2) {
break;
}
}
}
if (count>=2) {
return false;
} else {
return true;
}
}
}
这不起作用,因为它认为data\u list是一个null指针(我知道我将它声明为null,但是如果我将它设为private int[]data\u list=data\u list,它也不会编译)。我的最终目标是有一些控制,在这种情况下,它限制为2个项目,但我还想添加其他限制,如所有项目的总价值不能超过X或不能低于X,并希望通过不必每次进行完整计算来节省CPU功率。所以我认为我需要能够增加这些值,然后需要检查这些增量是否没有超过阈值
有人能帮我理解我做错了什么吗?难道我只是在语法上错了;还是我设计错了?//这里只能放命令。上面没什么。 计数器检查器=新计数器(数据列表); System.out.println(checker.check_data()) 当您调用checker.check_data()时,它试图通过数据_列表进行解析,但为空。因此,它抛出一个NullPointerException。
data\u list
是空的,因为在构造函数中,您可能需要像这样初始化this.data\u list=data\u list
,而不是data\u list=this.data\u list
(此处this.data\u list
没有如此空的引用)
如果避免该调用,输出将为2,3,4,5,6,7,8,9,10,11。//只能在此处输入命令。上面没什么。 计数器检查器=新计数器(数据列表); System.out.println(checker.check_data()) 当您调用checker.check_data()时,它试图通过数据_列表进行解析,但为空。因此,它抛出一个NullPointerException。
data\u list
是空的,因为在构造函数中,您可能需要像这样初始化this.data\u list=data\u list
,而不是data\u list=this.data\u list
(此处this.data\u list
没有如此空的引用)
如果避免该调用,输出将是2,3,4,5,6,7,8,9,10,11。旁注:将所有内容放在一个包含许多方法的大类中,不是“函数式”,而是“过程式”。Functional的意思是“没有可变状态”或“将函数作为第一类对象”。@Thilo谢谢,我会更新标题,我真的不知道一直以来都叫它Functional:-)从某种意义上说,我们都是N00B,跳过这一点。您的代码中有一个错误-在计数器构造函数中,您可能希望这样做:this.data\u list=data\u list,否则您将为参数变量指定默认值(null)。旁注:将所有内容放在一个包含多个方法的大类中,不是“functional”,而是“procedural”。Functional的意思是“没有可变状态”或“将函数作为第一类对象”。@Thilo谢谢,我会更新标题,我真的不知道一直以来都叫它Functional:-)从某种意义上说,我们都是N00B,跳过这一位。代码中有一个错误-在计数器构造函数中,您可能希望改为:this.data\u list=data\u list,否则您将默认值(null)分配给参数变量。啊,只需切换this…我认为这引用的是传入变量,而不是类中引用的变量。感谢简单的错误。啊,只需要切换这个…我认为这是指传入变量,而不是类中引用的变量。谢谢你犯了一个简单的错误。
public class LearningClassesCounter {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] list = new int[]{1,2,3,4,5,6,7,8,9,10};
int[] data_list = new int[list.length];
for (int current_location = 0; current_location<list.length;current_location++) {
//can only put commands in here. Nothing above.
Counter checker = new Counter(data_list);
System.out.println(checker.check_data());
for (int i =0; i<100; i++){
data_list[current_location] = (list[current_location]+1);
}
}
//its done now lets print the results
for (Integer item : data_list) {
System.out.println(item);
}
}
}
class Counter {
private int count; // current value
private boolean continue_or_not;
private int[] data_list;
// create a new counter with the given parameters
public Counter(int[] data_list) {
data_list = this.data_list;
count = 0;
continue_or_not = true;
}
public boolean check_data() {
// TODO Auto-generated method stub
int count = 0;
for (int item : data_list) {
if (item != 0) {
count++;
if (count>=3) {
break;
}
}
}
if (count>=3) {
return false;
} else {
return true;
}
}
// increment the counter by 1
public void increment() {
count++;
}
// return the current count
public int value() {
return count;
}
}