2014-11-21 4 views
0

내 코드 내에 논리 오류가있는 것 같습니다. 내 첫 번째 팬 객체 (FanOne)가 다음 출력을 표시해야하기 때문입니다. 속도 : 2, 반경 : 10.0, 색상 : 노란색.내 코드 내의 논리 오류

대신이 쇼의 속도가 : 내 setSpeed ​​() 메서드를 잘못 무언가가 생각 1

을 ..하지만 의도 한대로 모든 것이 해결해야처럼 나에게 보인다. 조언 해주세요, 고마워요. speed에 대한 setter 메소드에서

public class TestFan { 
public static void main(String[] args) { 

Fan FanOne = new Fan(); 

FanOne.fanOn(); 
FanOne.setColor("yellow"); 
FanOne.setCustomSpeed("MEDIUM"); 
FanOne.setCustomRadius(10); 

System.out.println(FanOne.toString()); 

System.out.println(); 

Fan FanTwo = new Fan(); 

FanTwo.fanOff(); 
FanTwo.setCustomRadius(5); 
FanTwo.setColor("blue"); 

System.out.println(FanTwo.toString()); 

} 
} 

public class Fan { 
// Declare constant data fields 
final int SLOW = 1; 
final int MEDIUM = 2; 
final int FAST = 3; 

private int speed; 
private boolean on; 
private double radius; 
private String color; 

// Construct a default fan 
public Fan() { 
    speed = SLOW; 
    on = false; 
    radius = 5; 
    color = new String("Blue"); 
} 

// Set fan off 
public boolean fanOff() { 
    on = false; 
    return on; 
} 

// Set fan on 
public boolean fanOn() { 
    on = true; 
    return on; 
} 

public double getRadius() { 
    return radius; 
} 

// Set custom radius 
public void setCustomRadius(double rad) { 
    radius = rad; 
} 

public int getSpeed() { 
    return speed; 
} 

// Set custom speed 
public String setCustomSpeed(String speed) { 
    if (speed.equals("SLOW")) { 
    this.speed = SLOW; 
} else if (speed.equals("MEDIUM")) { 
    this.speed = MEDIUM; 
} else if (speed.equals("FAST")) { 
    this.speed = FAST; 
} 
return speed; 
} 

public String getColor() { 
return color; 
} 

public void setColor(String colorName) { 
color = colorName; 
} 

public String toString() { 
if (on == true) { 
    return ("Speed: " + speed + ", " + "Radius: " + radius + ", " + "Color: " + color); 
} else { 
    return ("Color: " + color + ", " + "Radius: " + radius + ", Alert: " + "The fan is off!"); 
} 

} 

} 
+0

Y Daniel Liang의 Java 교과서 소개. 나는이 문제를 수년간 가르치기 위해 그의 책을 사용했다는 것을 알고 있습니다! – hfontanez

답변

2

, setCustomSpeed, 당신은 로컬 String 변수 speed을 변경, speed 변수가 아닌 인스턴스입니다. SLOW 또는 1에서 변경되지 않습니다.

this을 사용하여 인스턴스 변수 (예 : 그것은이 int

this.speed = SLOW; 

그래서 여기에 String에 상수를 변환 할 필요가 없습니다. 이에 따라 다른 할당 문을 변경할 수 있으며 this.speed도 반환 할 수 있습니다.

+0

빙고 !!!!!!!!!! – hfontanez

+0

토론 한 패러다임을 반영하도록 코드를 변경했습니다. 유일한 것은 "return this.speed"에 오류가 계속 발생했다는 것입니다. 나는 올바른 출력을내는 속도를 되돌리기 위해 그것을 바 꾸었습니다. 나는 그것이 왜 효과가 있었는지 완전히 확신하지 못합니다. 변수 범위와 그림자에 대해 읽으 려합니다.) – Chewy

+0

반환 값의 타입은 현재'String'이고,'speed'는'String'입니다. 또한'this.speed'를 리턴하고 메소드의 리턴 유형을'int'로 변경할 수 있습니다. 반환 된 것이 무엇인지에 따라 새로운 저장 값 또는 원래'String' 입력에도 따라 작동합니다. – rgettman

2

문제를 섀도 잉이라고합니다. 여기에 코드 :

// Set custom speed 
public int setCustomSpeed(String speed) { 
    if (speed.equals("SLOW")) { 
    speed = String.valueOf(SLOW); 
} else if (speed.equals("MEDIUM")) { 
    speed = String.valueOf(MEDIUM); 
} else if (speed.equals("FAST")) { 
    speed = String.valueOf(FAST); 
} 
return speed; 
} 

그것이 (생성자가 1로 설정) 전과 무엇이든지 동일한 팬 클래스 변수 속도를 떠나,이 동일한 로컬 변수 속도를 설정하는 것입니다. 이 때문에 this.speed를 사용하여 객체의 속도 변수를 구별해야합니다. 이것은 사용할 변수를 나타냅니다.

// Set custom speed 
public String setCustomSpeed(String speed) { 
    if (speed.equals("SLOW")) { 
    this.speed = String.valueOf(SLOW); 
} else if (speed.equals("MEDIUM")) { 
    this.speed = String.valueOf(MEDIUM); 
} else if (speed.equals("FAST")) { 
    this.speed = String.valueOf(FAST); 
} 
return this.speed; 
} 

나중에이를 피하려면 다른 이름의 변수를 사용하고 변수 범위와 섀도우를 읽고 이해해야합니다.

+0

올바르게 기억하면 상수 필드 이름이 할당에 정의되어 있습니다. OP를 선택하는 것이 아니 었습니다. – hfontanez

+1

@ hfontanez 예,하지만 OP는 항상 숙제를하지 않을 것이고, 결국 독자적으로 코드를 개발할 것입니다. 그럴 경우 –

+1

사실을 알고있는 것이 좋을 것입니다 ... 제안으로, 나는 'equalsIgnoreCase '대신 'equalals' – hfontanez