2012-09-25 4 views
0

나는 상속 관련 자바 장을 연구 중이며 몇 가지 질문이 있습니다.수퍼 클래스 생성자의 인수는 무엇입니까?

상속이 어떻게 작동하는지 (메소드, 정보 숨기기, 서브 클래스의 수퍼 클래스에서 개인 필드를 사용하는 방법 등) 기본적인 개념을 이해하고 있지만, 한 가지 문제가 있습니다.

수퍼 클래스에 매개 변수가없는 기본 생성자가있는 경우 하위 클래스에서 매개 변수없이 기본값 인 새 생성자를 만들어야하지만 첫 번째 문에서는 수퍼 클래스 생성자 호출이 있어야 함을 의미합니다..

좋아요, 지금까지 그렇게 좋았습니다. 나는 지금까지 이해하고있다. 하위 클래스에서는 생성자 매개 변수 중 하나와 일치하는 수퍼 클래스 생성자를 호출해야합니다.

그러나이 검사 다음 코드를 할 수 있습니다 : (수퍼)

public class Vehicle { 

    private int numOfWheels; 
    private double avgGallonsPerMile; 

    public Vehicle(int numOfWheels, double avgGallonsPerMile) { 

     this.numOfWheels = numOfWheels; 
     this.avgGallonsPerMile = avgGallonsPerMile; 
    } 
} 

그리고 또 다른 서브 클래스 코드 : 여기

public class Car extends Vehicle{ 

    public Car(double avgGallonsPerMile) { 
     super(What should i write here?, avgGallonsPerMile); 

     //force numOfWheels to 4; 

    } 
} 

는 서브 클래스에 대한 훈련이다 : 각 서브 클래스 이 생성자를 포함

그 갤런 당 마일 수를 인수로 받고 은 바퀴 수를 적절한 값으로 강제 설정합니다 오토바이 2 및 차를 4.

서브 클래스 생성자에서 나는 (자동차 용) 2 (오토바이 용) 어쨌든 그것을 강제로하기 때문에 numOfWheels 필드이 필요하지 않습니다.

하지만 어쨌든 수퍼 클래스의 데이터가 필요합니다. 해당 데이터를 가져올 위치는 어디입니까? 수퍼 클래스 생성자를 호출 할 때 첫 번째 매개 변수는 무엇이어야합니다.

하지만 여전히 외로운 사례는 아닙니다. 나는 서브 클래스 생성자에서 매개 변수로 특정 데이터가 필요하지 않지만 수퍼 클래스 생성자 호출에서 필요로하는 많은 연습 문제가 있습니다.

그런 경우 어떻게해야합니까?

나는 정말로 당신이 나를 이해하기를 바랍니다. 좀 어렵습니다.

+0

"나는 하위 클래스에서 특정 데이터가 필요하지 않습니다"a) 그것을 극복하거나 b) 수퍼 클래스에서 필드를 제거하십시오. –

+0

Uhm ... 의견에 바퀴의 수를 4로 만들겠다고 말하면 어떻게됩니까? 힌트 : numWheels 필드는 private이므로 Vehicle 클래스 내에서만 액세스 및 수정/설정할 수 있습니다. 즉, numWheels에 적절한 값을 Car 생성자의 수퍼 클래스 생성자에 보내야합니다. – Alderath

답변

2

하는 경우는 어쨌든 수정하면을보다 오토바이 같은 자동차에 대해 4 단계와 2!

super(4, avgGallonsPerMile); 

또는 더 좋은 방법은 - 상수를 선언

private static final int NUM_OF_WHEELS = 4; 
.. 
super(Car.NUM_OF_WHEELS, avgGallonsPerMile); 
1

매우 간단하십시오 Car에 바퀴의 수는 항상 4의 경우, 그들이 단순히 값 4를 전달합니다

public Car(double avgGallonsPerMile) { 
    super(4, avgGallonsPerMile); 

    // ... 
} 
2

당신이 슈퍼 클래스의 필드가 필요하지 않은 경우 다음 기회는 없을해야합니다. 대신 다음을 수행 할 수 있습니다.

public abstract class Vehicle { 
    private final double avgGallonsPerMile; 

    public Vehicle(double avgGallonsPerMile) { 
     this.avgGallonsPerMile = avgGallonsPerMile; 
    } 
    public double getAvgGallonsPerMile() { return avgGallonsPerMile; } 
    public abstract int getNumOfWheels(); 
} 

public class Car extends Vehicle{ 
    public Car(double avgGallonsPerMile) { 
     super(avgGallonsPerMile); 
    } 
    public int getNumOfWheels() { return 4; } 
} 

public class Bicycle extends Vehicle{ 
    public Bicycle (double avgGallonsPerMile) { 
     super(avgGallonsPerMile); 
    } 
    public int getNumOfWheels() { return 2; } 
} 

public class Tricycle extends Vehicle{ 
    public Tricycle (double avgGallonsPerMile) { 
     super(avgGallonsPerMile); 
    } 
    public int getNumOfWheels() { return 3; } 
} 

BTW : 연료 1 마일당 갤런을 사용하는 자동차는 실제로 비효율적이어야합니다.

+0

+1 수퍼 클래스에서 필요하지 않은 경우 거기에 없어야한다고 설명하는 +1입니다. – Jesper

+0

avgGallonsPerMile은 소수 일 수 있습니다. –

+0

필드를 수퍼 클래스의 일부로 사용하고 해당 값을 하위 클래스 생성자의 수퍼 클래스 생성자에 인수로 전달하면 무엇이 문제입니까? (숙제 문제를 분명히 의도 한 사람처럼) – Alderath

관련 문제