2011-10-15 1 views
0

얘들이 예제의 출력은 오는 방법을 나에게 설명해주십시오 수 있습니다이 상속 Java 프로그램의 출력을 설명 하시겠습니까?

Exam1 
    This is Tennis Shoes 
    derived class 
    This is a white Tennis Shoes is created 

우리가 White Tennis Shoes의 객체를 생성하고 무슨 일 이후 정확히 무슨 일이 있었는지 나에게 설명 할 수있는 경우. 제발 들으십시오. 숙제 나 제 시험을 준비하고있는 것을 제게 말하지 마십시오. 저는 이것이 오래된 질문입니다.

코드

은 다음과 같습니다 : 자바의 클래스에서 호출 부모 생성자를 지정하지 않으면

class Shoes{ 
    public Shoes(){ 
     this("you have created a shoes Object"); 
     System.out.println("This is the base class"); 
    } 

    public Shoes(String s){ 
     System.out.println(s); 
    } 
} 

class TennisShoes extends Shoes{ 
    public TennisShoes(){ 
     this("This is Tennis Shoes"); 
     System.out.println("derived class"); 
    } 

    public TennisShoes(String s){ 
     super("Exam1"); 
     System.out.println(s); 
    } 
} 

class WhiteTennisShoes extends TennisShoes{ 
    public WhiteTennisShoes(String s){ 
     System.out.println(s); 
    } 
} 

class ConstructorPrintingTester{ 
    public static void main(String[] args){ 
     WhiteTennisShoes shoesObj; 
     shoesObj = new WhiteTennisShoes("This is a white Tennis Shoes is created"); 
    } 
} 
+3

숙제 이건 아니건 상관없이, 먼저 무슨 일이 일어나는지에 대한 해석을 내리지 않겠습니까? –

+0

'this ("xxxx")를 호출하면 현재 생성자 내부에 또 다른 생성자가 호출되어 15 분 후에 생각을 멈추게했다는 것을 알지 못했습니다! Phihag 덕분에 지금은 정말 분명합니다. 나는 그가 도움이되는 방법을 좋아합니다. –

+0

또한 나는'super()'생성자를 호출 할 때 Java가 나를 위해 생성자를 생성한다는 사실을 완전히 잊었다. 그래서 이것이 결과물에서 실제로 이해할 수없는 이유입니다. –

답변

3

는 생성자가 실행됩니다 덜 슈퍼 생성자 인 경우 0을 갖는 TennisShoes 생성자가 호출됩니다. 현재 호출 스택은 TenniesShoes()는 첫 번째 줄에있는 다른 생성자를 호출하지, 다음 지금

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 

입니다. 현재 호출 스택은 생성자 인수 "Exam1"와 함께 하나의 인수 슈퍼 생성자를 호출

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 

이제입니다.Shoes의 한 인수 생성자는 생성자, 지금라고 슈퍼 클래스 객체의 암시를 호출하지 않기 때문에 호출 스택은

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 
Shoes("Exam1") 

이다; 호출 스택은, 그 후

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 
Shoes("Exam1") 
Object() 

입니다 호출 스택은 풀어진이며 모든 인쇄 순서대로 호출됩니다

  1. Shoes("Exam1") 인쇄 "Exam1"
  2. TenniesShoes("This is Tennis Shoes") 인쇄 "This is Tennis Shoes"
  3. TenniesShoes() 인쇄 "derived class"
  4. WhiteTennisShoes("This is a white ...") 인쇄물 "This is a white ..."
  5. main은 아무것도 인쇄하지 않고 종료합니다.
+0

정말 고마워요! 나는 네 걸음에서 이해하려고 노력하고있어. 하지만 사용하지 않기 때문에 혼란 스럽습니다. 'This (This is Tennis Shoes) '는 무엇을 의미합니까? –

+0

오, 오, 나는 당신의 계단을 읽은 후 그것이 지금 의미하는 바를 얻었습니다. 너는 너무 도움이되었다. 계속합시다. 나는 시험에서 이런 종류의 질문을 만났을 때 당신의 조치를 취하는 것이 나에게 더 좋을 것이라고 생각합니다. –

+0

내가 알지 못했던 2 가지/awareOF 1-Java가 나를 위해'Super()'를 만들면 Java가 생성됩니다. 2 - 전에 결코 시도하지 않았기 때문에 생성자를 생성자 내부에서 호출합니다. 하지만 이제는 분명합니다. 매우 감사 . –

0

가 기본 부모 생성자는 인스턴스 중이라고합니다. 귀하의 경우에 새로운 WhiteTennisShoes을 생성하면 자동으로 기본 상위 생성자 인 TennisShoes()이 호출됩니다. 그러면 TennisShoes()이 호출되며 Shoes(String)이 호출됩니다.

이 경우 기억해야 할 중요한 점은 Java에서 클래스를 인스턴스화하는 것은 클래스 및 모든 부모 클래스의 생성자를 호출한다는 것입니다. 호출 할 부모 생성자를 지정할 수 있습니다. 부모 생성자가없는 경우에는 기본, 인수가없는 부모 생성자가 호출됩니다.

0

WhiteTennisShoes 생성자를 호출합니다. 이 생성자에는 super() 호출이 없으므로 컴파일러에서 자동으로 삽입하므로 첫 번째 작업에서는 수퍼 클래스의 인수가없는 생성자 인 TennisShoes를 호출합니다.

인수가없는 TennisShoes 생성자는 "This is Tennis Shoes"가 포함 된 다른 생성자를 인수로 호출합니다. 이 생성자가 수행하는 첫 번째 작업은 "Exam1"을 인수로 사용하여 수퍼 클래스의 생성자를 호출하는 것입니다.

따라서 신발 생성자는 Exam1을 인수로 사용하여 Exam1을 출력합니다. 그런 다음 TennisShoes 생성자는 실행을 계속하고 인수를 출력합니다. "This is Tennis Shoes". 그런 다음 TennisShoes no-arg 생성자가 실행을 계속하고 "파생 클래스"를 출력합니다. 그런 다음 WhiteTennisShoes 생성자는 실행을 계속하고 그 인수를 출력합니다. "This is white Tennis Shoes is created". 각 생성자는 슈퍼 나 첫 번째 줄에있는 다른 생성자를 호출해야합니다

public WhiteTennisShoes(String s){ 
    super(); // This line is automatically inserted 
    System.out.println(s); 
} 

때문에, 그리고 일 때문에 자바가 자동으로 paremeter-를 호출 할 수 있습니다 : 당신이 유형 WhiteTennisShoes의 객체를 생성 할 때

관련 문제