2012-07-15 3 views
0

하위 클래스의 생성자를 사용하여 객체를 만들려고하지만 하위 클래스 생성자에서 해당 객체에 값을 할당 할 수 없습니다.Java Subclass 생성자 값 지정

다음은 수퍼 클래스입니다.

public class Bike 
{ 
    String color = ""; 
    String type = ""; 
    int age = 0; 

    public static void main (String [] args) 
    { 
    } 

    public Bike (String s, int i)   // Constructor 
    { 
     color = s; 
     age = i; 
    } 

    public void PrintBike() 
    { 
     if (type == "") 
     { 
      System.out.print(" You didn't give the proper kind of bike."); 
     } 
     else 
     { 
      System.out.print(" Your bike is a " + type + " bike. \n"); 
     } 
    } 
} 

이것은 하위 클래스입니다.

public class BikeAdv extends Bike 
{ 
    private String type; 

    public BikeAdv (String color, int age, String BikeType) 
    { 
     super (color, age); 
     type = BikeType; 
    } 
} 

다음은 생성자를 호출하는 클래스입니다.

public class Green 
{ 
    public static void main (String [] args) 
    { 
     Bike greenBike = new BikeAdv ("Green", 20, "Mountain"); 
     greenBike.PrintBike(); 
    } 
} 

"녹색"등급을 실행하면 출력이 "적절한 종류의 자전거를주지 못했습니다." 나는 "당신의 자전거는 산악 자전거"라고 기대할 것입니다.

감사합니다.

답변

0

당신은 명시 적 가시성없이 이러한 특성을 선언 :

String color = ""; 
    String type = ""; 
    int age = 0; 

또한, 당신은 typeBikeAdv에 재 선언이, 그 오류가 (당신이 필요하지 않습니다) 아마.

클래스에서 이러한 속성에만 액세스 할 수있게하려면 private으로 선언해야합니다. 그러나이 경우 생성자를 매개 변수화하여 모든 매개 변수를 수정할 수 있어야합니다. 또는 그들을위한 세터를 만들 수도 있습니다 (이 방법으로 클래스 외부에서 접근성을 부여한다는 점에 유의하십시오). 보호로

private String color = ""; 
    private String type = ""; 
    private int age = 0; 

당신이 그들을 동급 외부에서 변경 불가능한 싶은 경우에, 그러나 그것의 서브 클래스에서 액세스 할 수있는 다음을 선언

protected String color = ""; 
    protected String type = ""; 
    protected int age = 0; 

당신이 볼 수 있듯이, 많은 가능성이있다. 여기에서 확인하십시오 :

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

+1

이 문제가 해결되었습니다. 나는 더 깊이있는 링크를 읽을 것이다. 감사! – YellowTellow

0

Bike 클래스는 추상적이거나 인터페이스가 아니므로, 모든 메소드가 Bike 클래스에서 말한 것과 같습니다. greenBike를 BikeAdv가 아닌 Bike로 지정하면 BikeAdv 클래스 대신 Bike 클래스의 메서드를 사용하도록 지시합니다. 최선의 방법은 자전거를 추상화하고 본문없이 PrintBike를 무효화하는 것입니다.

또한 BikeType String을 수퍼 클래스에 전달하지 않으므로 수신 할 방법이 없습니다.

3

하위 클래스의 type 필드는 수퍼 클래스의 type 필드를 어둡게합니다. 수퍼 클래스의 필드는 절대로 채워지지 않으며, 검사 대상이됩니다.

하위 클래스의 필드를 제거하면 상위 클래스 필드가 할당되어 예상 한대로 코드가 작동합니다.

다른 답변에서도 언급했듯이 기본 표시 여부보다는 필요에 따라 입력란을 비공개로 설정하거나 보호하는 것이 좋습니다.