2016-07-24 2 views
-1

현재 Java에서 두 클래스를 설계 중이며 현재의 상속 문제를 이해하는 데 어려움을 겪고 있으므로 간단한 예제 코드를 작성했습니다. 누군가 나에게 무슨 일이 일어나는지 이해하도록 도울 수 있습니다.부모 클래스의 메소드를 재정의하지 않고 자식 클래스의 변수로 사용하기

그래서이 예제에서는 부모 클래스 (일반적으로 Car 클래스라고 부름)와 자식 클래스 (RedCar 클래스)를 사용합니다. 부모 인 클래스는 애트리뷰트 거리를 포함하고 computeVelocity 메소드를 포함하는데,이 메소드는 입력 인자 time (double)을 취하고 distance의 double 값을 time으로 나누어 리턴한다.

하위 클래스에는 생성자 RedCar (double inputDistance)가 있습니다. 또한 오버라이드하지 않고 computeVelocity 메소드에 액세스해야합니다.

여기가 문제의 원인입니다. 논리적으로, computeVelocity는 다른 클래스의 메소드를 호출하기 때문에 RedCar에서 inputDistance 변수를 가져 오면 안된다는 것을 이해합니다. 그러나 내가 알고 싶은 것은 그 메소드를 RedCar 클래스에 가져 와서 생성자에게 넘겨주는 인자로 클래스 안에서 사용할 수 있도록하는 것이다. 여기

당신이 대답에, 당신이 정말로 필요로하지 않고 한 번 부모 클래스와 (2 회 거리가 없어야 의견의 일부에 명시된 바와 같이 코드

//Car Class 
public abstract class Car{ 
    //abstract variable 
    private double distance; 
    //compute velocity method 
    public double computeVelocity(double time){ 
    return distance/time; 
    } 
} 




//RedCar Class 
public class RedCar extends Car{ 
    public double distance; 

    public RedCar (double inputDistance){ 
     this.distance = inputDistance; 
    } 
    //This is currently my method but I believe this already constitutes as overridding 
    public double computeVelocity(double hours){ 
     Car.super.computeVelocity(hours); 
    } 
} 
+0

그것은 당신이 여기서 뭘하려는, 또는 왜 방법이 전혀 오버라이드 (override) 할 필요가 무엇을 나에게 정말 분명하지 않다 :

당신이 메서드를 호출 할 수 있습니다. 오버라이드가 아무 것도 추가하지 않기 때문에 왜 모든 것을 추가 할 수 있습니까? 왜 그냥 기본 클래스의 'computeVelocity' 메서드를 사용하지 않을까요? – David

+1

하위 클래스에 두 번째 거리 필드가 없어야합니다. 그런데 기본 클래스의 distance 필드는 항상 0입니다. 기본 클래스에서 distance를 인수로 사용하여 보호 된 생성자를 가지고 하위 클래스 생성자에서 (super (distance)를 사용하여) 호출하십시오. –

답변

0

의 예입니다 아이 클래스에 한 번). 부모 클래스의 distance 매개 변수를 사용하면 메서드를 재정의 할 이유가 없습니다. super 키워드를 사용하여 상위 클래스 메소드를 호출 할 수 있습니다.

희망이 도움이됩니다.

0

개인 인스턴스 변수는 하위 클래스에서 상속되지만 하위 클래스에서는 액세스 할 수 없으므로 (리플렉션을 사용하여 액세스 할 수 있습니다). Public setter 또는 getter 메서드를 제공하거나 protected 또는 public 생성자를 제공하고 하위 클래스에서 해당 생성자를 호출하여 Car 인스턴스 변수 private double distance에 값을 제공하는 두 가지 방법이 있습니다. 거기에 자신의 회원 만 액세스 할 개인 회원이 자신의 방법과 생성자에 의해 의미하기 때문에

링크에게 개인 거리 변수에 값을 설정 슈퍼 클래스의 Do subclasses inherit private fields? 상속 - 개인 필드

생성자를 참조하십시오.

protected Car(double distance){ 
    this.distance = distance; 
    } 

은 또한 당신은 당신이 (서브 클래스의) 당신의 방법 computeVelocity에서 사용되지 않기 때문에 서브 클래스에서 다시 거리 변수를 정의 할 필요가 없습니다. subclass 메소드는 수퍼 클래스 메소드를 호출하고 수퍼 클래스 메소드는 자신의 private double distance를 사용하기 때문에. 따라서 거리 변수는 수퍼 클래스 메서드에서 사용하지 않는 하위 클래스에서 정의됩니다.

슈퍼 클래스에서 보호 된 생성자를 제공 한 후에는 super 키워드를 사용하여 서브 클래스 생성자에서이를 호출 할 수 있습니다. super 키워드는 수퍼 클래스의 생성자를 호출합니다. 우리는 수퍼 클래스에서 생성자를 제공하므로 java는 수퍼 클래스에 기본 생성자를 추가하지 않습니다. 그리고, 슈퍼 클래스 메소드가 필요 자동차를 호출하지하는

 public RedCar(double inputDistance) { 
    super(inputDistance); 

     } 

변수 개인을 두 번 거리 그리고 올바른 방법으로 값을 할당 슈퍼 사용하여 하위 클래스에서 해당 생성자를 호출.슈퍼

public double computeVelocity(double hours) { 
     return super.computeVelocity(hours); 
    } 
0

클래스 RedCar 상속 클래스 Car. 그래서 Car은 다른 클래스가 아닙니다. RedCar 인스턴스를 만드는 경우 Car의 모든 부품도 사용할 수 있습니다. A RedCarCar입니다.

상위 클래스와 하위 클래스에 모두 distance 필드를 만들었습니다. 사실 각각 인스턴스에 distance이라는 두 개의 필드가 있습니다.

여기에 가시성이 있습니다. 개인 변수 distanceRedCar의 일부이지만 Car 클래스에서만 볼 수 있습니다. Car에 정의 된 메서드 만 distance에 액세스해야하는 경우 가시성을 변경할 필요가 없습니다. 그러나 distance을 설정하는 방법이 필요합니다. 시간이 지남에 따라 값이 변경되지 않으면 클래스 Car에 생성자를 포함해야합니다.

에 정의 된 computeVelocity() 메서드의 가시성은 공개되어 있으므로 하위 클래스에서이를 반복 할 필요가 없습니다. RedCarCar이므로 각 RedCar 인스턴스에서 computeVelocity()으로 전화 할 수 있습니다. RedCar 생성자가 호출

RedCar redCar = new RedCar(100.0); 

먼저 100.0distance 필드를 설정 Car 생성자를 호출

public abstract class Car{ 
    private double distance; 

    // Constructor with visibility protected. 
    // So it is visible in each subclass and must be 
    // called by each subclass constructor. 
    // Btw.: It is common practice to use the same name 
    // for input parameters as for fields. The field 
    // variable can be accessed with the "this" keyword. 
    protected Car(double distance) { 
    this.distance = distance; 
    } 

    //compute velocity method 
    public double computeVelocity(double time){ 
    return distance/time; 
    } 
} 


public class RedCar extends Car{ 
    public double distance; 

    public RedCar (double distance){ 
    // Call the Car constructor 
    super(distance) 
    } 

    // No need to repeat the definition of 
    // computeVelocity unless you want to redefine 
    // the behaviour.. 
} 

그런 다음 당신은 RedCar 인스턴스를 만들 때.

double velocity = redCar.computeVelocity(60.0); 
관련 문제