2017-11-02 4 views
0

자바에서 오버라이드하는 메소드를 이해하려고합니다. 개인 메서드를 재정의 할 수 없음을 이해합니다. "This is a Superclass outputthis is super class variable"자바에서의 개인 메소드 오버라이드

이 나있는 클래스 사실에 객체 (SB)를 참조 않습니다 위해 이해 도와주세요 :

public class Superclass 
{ 
    private String name; 

    Superclass(String name) { 
     this.name=name; 
    } 

    private void printName(String name) { 
     System.out.println("This is a Superclass output"+name); 
    } 
} 

public class Subclass extends Superclass 
{ 
    Subclass(String name) { 
     super(name); 
    } 

    public void printName(String name) { 
     System.out.println(name); 
    } 
} 
public static void main (String[] args) { 
    Superclass sb = new Subclass("Superclass"); 
    //System.out.println(sb.getClass().getName()); 
    sb.printName("this is super class variable"); 
} 

나는 코드 의 미리보기와 출력을 실행하려합니다. 은과 printName는 슈퍼 클래스의 공개 때 표시되는 출력은 다음과 같습니다

"this is super class variable"

sb은 민간 및 공공 수식에 따라 두 개의 서로 다른 클래스를 가리키는 왜 나를 이해하는 데 도움이 바랍니다.

+1

[Java에서 기본, 공개, 보호 및 개인 간 차이점] 가능한 복제본 (https://stackoverflow.com/questions/215497/in-java-difference-between-default-public-protected-and- 개인) –

답변

0

클래스 외부의 개인 메서드에 액세스 할 수 없습니다. 그래서 당신은 당신이 당신의 슈퍼 클래스 개인 최소한의 패키지의 printName() (= 없음 수정)를 확인해야 "This is a Superclass outputthis is super class variable"을 인쇄하려면

  | Class | Package | Subclass | Subclass | World 
      |  |   |(same pkg)|(diff pkg)| 
————————————+———————+—————————+——————————+——————————+———————— 
public  | + | + | +  |  + | +  
————————————+———————+—————————+——————————+——————————+———————— 
protected | + | + | +  |  + |   
————————————+———————+—————————+——————————+——————————+———————— 
no modifier | + | + | +  |   |  
————————————+———————+—————————+——————————+——————————+———————— 
private  | + |   |   |   |  

+ : accessible 
blank : not accessible 

src

:

은 다음 표 *에서보세요 . 두 번째 질문에

:

이 나있는 클래스 사실에 객체 참조 SB 않습니다 위해 이해하는 데 도움이 바랍니다. 그리고 printName가 슈퍼 클래스에 공개 때 표시되는 출력은 다음과 같습니다

"이는 슈퍼 클래스 변수"당신은에서의 인스턴스를 생성하기 때문에

자바가 자동으로 서브 클래스의 기능을한다 :

여기
Superclass sb = new Subclass("Superclass"); 
1
Superclass sb = new Subclass("Superclass"); 

Superclass 참조 변수 sbSubclass 객체에 Superclass 객체를 검색하고이됩니다 Subclass extends Superclass부터 그곳에있는 그대로 찾을 수 있습니다. 이 메소드를 실행 재정의 된 방법이 있으면되도록 sb 보낸

여기
sb.printName("this is super class variable"); 

Subclass 객체 가리키는. 더 오버라이드 (override)되는 메소드가 존재하지 않는 경우 참조 유형이 Superclass 때문에

그러나

, 그것은 항상 Superclass 방법을 실행합니다.

참고 : 당신이 당신의 출력 자체가 질문에 대답 할 때와 같은 질문을 할 필요가 없습니다 것입니다, 그래서 http://www.codejava.net/java-core/the-java-language/12-rules-of-overriding-in-java-you-should-know

Why parent class type reference variable having reference to child class object can't access child class's Methods

+0

thnx. 내가 공유 한 링크가 모든 의문점을 해결했습니다. – sruthi

0

우선 첫째, 당신은 스스로 더 탐구해야한다. 당신의 질문은이 행동이 왜 아닌지에 관한 것입니다. 질문에 대한 답변입니다.Super super=new Super();
사례 2 :Super superSubclass=new Subclass(); //extends Super and instance refered by Super
사례 3 :Subclass subclass=new Subclass();// Referenced by own

사례 1 :이 클래스는 지구상의 다른 구현에 대한 인식하지 않는 2 senarios

사례 1 이하로 고려 그래서 액세스 할 수있는 것은 모두 Super 클래스 내에서 자체 선언 된 메소드입니다 (ALL은 모두 Private를 포함하여 모든 것을 의미 함). 그래서 혼란은 이제까지이 수업 만 보지 않습니다.

사례 2 : 명세서 별 Subclass는 Super의 구현이며 인스턴스는 Super를 참조하여 생성됩니다. 그것은 인스턴스의로 참조 번호가 동일한 경우 1처럼 고려 :이 경우 superSubclass는 CASE 1에 부가하여 확장 된 구현에서 재정의 방법을 액세스 할 수 하면

Case3은 서브 클래스 SUPER + 오버라이드 방법의 모든 방법을 의미 그것은 그것의 모든 메소드 + 그것의 서브 클래스의 비 개인 메소드에 액세스 할 수 있습니다.

나는 당신의 질문과 같은 음색으로 이것을 대답하고 혼란을 없애려고 노력했다. 하지만 당신이 이해해야 할 주요한 점은 결국이 개념이 결국 당신의 개념을 분명히 해줄 것입니다. 그러나 나는 초급자이므로 위에서 언급 한 출력을 예측하기 시작하면 배우게됩니다.

건배!

0

private 메서드의 호출은 컴파일 타임에 결정되기 때문에. (그런데 컴파일러에서는 super 메서드도 결정됩니다.)

바이트 코드로 설명하겠다.

public class Q47069297 { 
    public static void main(String[] args) { 
    SuperClass sc = new SubClass(); 
    sc.print(); 
    } 

    private static class SuperClass { 
    private void print() { 
     System.out.println("super"); 
    } 
    } 

    private static class SubClass extends SuperClass { 
    private void print() { 
     System.out.println("sub"); 
    } 
    } 
} 

그리고 SuperClass.print의 호출의 바이트 코드 :

10 invokestatic xdean.stackoverflow.java.Q47069297$SuperClass.access$1(xdean.stackoverflow.java.Q47069297$SuperClass) : void [21] 

문제점은 무엇입니까
첫 번째는 소스 코드? 우리는 print라고 불렀지 만, SuperClass.access$1가있다!
는 이제 SuperClass의 바이트 코드에 가서 정말 access$1

static synthetic void access$1(xdean.stackoverflow.java.Q47069297.SuperClass arg0); 
    0 aload_0 [arg0] 
    1 invokespecial xdean.stackoverflow.java.Q47069297$SuperClass.print() : void [32] 
    4 return 
     Line numbers: 
     [pc: 0, line: 10] 

와우,이 방법, access$1라는 이름의 합성 방법을 찾아 보자. 그래서 우리는 클래스 자체에서 private 메소드를 호출하는 것이 자바 컴파일러의 속임수라는 것을 알 수 있습니다. 클래스에서 패키지 친숙한 정적 메서드를 생성하고 호출합니다.그래서 소스 코드는 다음과 같아야합니다

SuperClass sc = new SubClass(); 
SuperClass.access$1(sc);// sc.print(); 

이 실제로 정적 메서드 호출이기 때문에이 SubClass를 호출하지 않습니다.

관련 문제