2017-11-06 1 views
0

차량을 만들고 비교하는 "Racing Simulator"를 만들려고합니다. 여기에는 차량이 정의 된 클래스와 속도가 비교되는 주 클래스가 포함됩니다. Vehicle의 두 인스턴스를 만들고 두 인스턴스에서 getSpeed ​​메서드를 사용하면 속도가 동일합니다. 왜 그런가?Java 클래스의 인스턴스 생성과 관련된 문제

주성분 :

public class Main { 

    static Vehicle bike, jeep; 
    //static Race race; 

    public static void main(String args[]) { 
     bike = new Vehicle(4000, 20, 30.5, "bike"); 
     jeep = new Vehicle(3000, 12, 9.8, "Jeep"); 
     //race = new Race(bike, jeep, 0); 
     System.out.println("Bike: " + bike.getTopSpeed() + " Jeep: " + jeep.getTopSpeed()); 
    } 
} 

차량 :

public class Vehicle { 

    static int _weight, _topSpeed; 
    static double _zeroToSixty; 
    static String _vehicleName; 

    public Vehicle(int weight, int topSpeed, double zeroToSixty, String vehicleName) { 
     _weight = weight; 
     _topSpeed = topSpeed; 
     _zeroToSixty = zeroToSixty; 
     _vehicleName = vehicleName; 
    } 

    public static void setVehicleName(String name) { 
     _vehicleName = name; 
    } 

    public static void setWeight(int weight) { 
     _weight = weight; 
    } 

    public static void setTopSpeed(int topSpeed) { 
     _weight = topSpeed; 
    } 

    public static void setZeroToSixty(double zeroToSixty) { 
     _zeroToSixty = zeroToSixty; 
    } 

    public static String getVehicleName() { 
     return _vehicleName; 
    } 

    public static int getWeight() { 
     return _weight; 
    } 

    public static int getTopSpeed() { 
     return _topSpeed; 
    } 

    public static double getZeroToSixty() { 
     return _zeroToSixty; 
    } 
} 

본체의 출력은 :

"자전거 12 지프 12"

+1

'_topSpeed'는'정적 '이므로 문제가됩니다. 변수 선언에서'static' 수정자를 제거하십시오. ClassLoader 당 –

답변

0

필드를 static으로 선언하고 있습니다. 즉, 클래스의 모든 인스턴스 사이에 필드가 입니다. _topSpeed에 할당 된 마지막 값은 12입니다 (두 번째 생성자 호출에서부터).이 값은 클래스의 두 인스턴스에 표시되는 값입니다.

각 인스턴스에 고유 한 _topSpeed을 지정하려면 static 한정자를 삭제해야합니다. 이 충분 : 최종 논평으로

int _weight, _topSpeed; 
double _zeroToSixty; 
String _vehicleName; 

, 그것은 일반적으로 좋은 아이디어를 당신이 정말로 액세스의 다른 유형을 가지고 그들을 필요로하지 않는 private과 같이 필드를 선언 할 수 있습니다. 그래서 보통 다음과 같이 쓸 것입니다 :

각 필드를 고유 한 라인에두면 각 필드의 전체 선언을 볼 수 있습니다.

1

정적 필드 번만 당 존재 ClassLoader. 정적 필드를 인스턴스 필드로 변환하면 정상이어야합니다.

당신이, 당신이 정적 메인 클래스의 변수를 유지할 수 싶지만, Vehicle 클래스의 모든 변수는

+0

? 다른 ClassLoader에서 같은 클래스를로드하면 서로 다른 것으로 간주된다는 사실을 언급하고 있습니까? 아니면 다른 어떤 결론이 유효합니까? 그냥 궁금해서 – gpeche

+0

@ 예, 그렇습니다.하지만 문제가되는 상황에 들어가기는 꽤 어렵습니다. 인공적인 시나리오는 다음과 같습니다. https://ideone.com/e8z2Sv –

0

당신이

this._topSpeed() 

을 사용하려 했 static 키워드를 잃을해야하는 경우 정적이 아닌 일반 변수를 사용하십시오. 왜 밑줄을 사용합니까?

1

각 차량 인스턴스에는 고유 한 이름, 최고 속도, 가중치 등이 있어야합니다. 즉, 정적이 아닌 인스턴스 변수로 선언되어야합니다.

변경 다음

static int _weight, _topSpeed; 
static double _zeroToSixty; 
static String _vehicleName; 

또한

int _weight, _topSpeed; 
double _zeroToSixty; 
String _vehicleName; 

에, 좋은 방법으로, 이들에 대한 private의 범위 한정자를 사용합니다.

0

각 차량 객체에 고유해야하는 지형지 물에 대한 정적 변수가 있습니다. Static은 객체와 반대로 클래스의 속성으로 만듭니다. 이러한 인스턴스 변수를 작성하면 문제를 해결하는 데 도움이됩니다.

관련 문제