将范围为JAVA的所有奇数相加
我有一个问题,我有正确的(第1部分)和错误的代码(第2部分)。我搞不懂为什么不正确的代码是不正确的
那个
static int sum = 0
部分是第2部分代码中不正确的部分。如果那行代码移到第1部分的同一位置。代码是有效的
如果范围在10到20之间。第2部分输出的111之和不正确。总数应该是75。有三种可能的组合可以得到111
18 + 18 + correct sum
17 +19 + correct sum
16 + 20 + correct sum
我猜第二部分经过18+18?但是怎么做
第1部分正确代码
ublic class SumOddRange {
public static boolean isOdd(int number){
if (number <= 0) {
return false;
}
return number % 2 != 0;
}
public static int sumOdd(int start, int end){
if ( (end < start) || (start < 0) || (end < 0) ){
return -1;
}
int sum = 0;
for (int i = start; i<=end; i++){
if (isOdd(i)){
sum +=i;
}
}
return sum;
}
第2部分错误代码
public class SumOddRange {
public static boolean isOdd(int number) {
if((number > 0) && (number % 2 != 0)) {
return true;
}
else {
return false;
}
}
static int startOne = 0;
static int sum = 0;
public static int sumOdd(int start, int end) {
if ((end >= start) && (end > 0) && (start > 0)) {
for (startOne = start; startOne <= end; startOne++) {
if (isOdd(startOne)) {
sum += startOne;
}
}
return sum;
} else
return -1;
}
# 1 楼答案
问题是您正在使用
static
变量什么是
static
创建类后,可以创建该类的实例(也称为对象)。这就是当你使用像
SumOddRange a = new SumOddRange();
SumOddRange b = new SumOddRange();
您可能知道,类中有方法和变量。这些方法和类可以分为
这意味着某些方法和变量确实属于该类,因此该类的所有实例都共享该变量或方法。这就是
static
的用途。因此,如果上图中的类有一个名为staticAttributeName
的静态属性,a.staticAttributeName
和b.staticAttributeName
必须相同如果变量不是静态的,则实例不会共享该变量。所有实例都有自己的实例。因此,尽管它们的名称相同,但保存在变量中的值不必相同。因此,如果上图中的类有一个名为
attributeName
的非静态属性,a.attributeName
和b.attributeName
不一定是相同的一个例子:
如您所见,变量
sum
是静态的。这意味着a.sum
和b.sum
是相同的。在main方法中,我们两次调用方法addOne
,因此两个输出是“a2”和“b2”我们现在在类
Add
中有一个非静态变量sum
addOne
一次,所以第一个输出是“a1”李>addOne
被调用了两次,因此输出为“b2”李>解决问题
这个类产生输出
75
和150
。这种情况是这样的,因为s
和t
使用了相同的变量sum
,所以第一次,求和是正确的,但第二次计算的结果是75+sumOdd(10,20) = 75+75 = 150
我们现在知道,主要的问题是变量是
static
。这就引出了只使用非静态变量的想法,这是这里最好的想法:另一种选择是在实际计算总和之前重置变量
sum
。这种方法的缺点是,您将无法再访问早期结果: