아니요. 상속하지 않습니다.
다른 클래스가 간접적으로 사용할 수 있다는 사실은 상속에 대해 아무것도 말하지 않고 캡슐화에 대해 말합니다.
예를 들어 :
class Some {
private int count;
public void increment() {
count++;
}
public String toString() {
return Integer.toString( count );
}
}
class UseIt {
void useIt() {
Some s = new Some();
s.increment();
s.increment();
s.increment();
int v = Integer.parseInt( s.toString() );
// hey, can you say you inherit it?
}
}
반사를 통해 count
내부 의 가치를 얻을 수도 있습니다 UseIt
. 그것은 당신이 그것을 상속한다는 의미는 아닙니다.
최신 정보
값은 있지만 서브 클래스에 의해 상속되지 않습니다.
예를 들어 다음과 같이 정의 된 서브 클래스 :
class SomeOther extends Some {
private int count = 1000;
@Override
public void increment() {
super.increment();
count *= 10000;
}
}
class UseIt {
public static void main( String ... args ) {
s = new SomeOther();
s.increment();
s.increment();
s.increment();
v = Integer.parseInt( s.toString() );
// what is the value of v?
}
}
이것은 첫 번째 예와 정확히 같은 상황입니다. 속성 count
은 숨겨져 서브 클래스에 의해 상속 되지 않습니다 . 여전히 DigitalRoss가 지적했듯이 그 가치는 있지만 상속 수단은 아닙니다.
이렇게하세요 당신의 아버지가 부유하고 당신에게 신용 카드를 주더라도, 당신은 여전히 그의 돈으로 물건을 살 수 있지만 , 그 돈을 모두 상속 받았다는 것을 의미 하지는 않습니까?
다른 업데이트
속성이 왜 존재하는지 아는 것은 매우 흥미 롭습니다 .
솔직히 설명 할 정확한 용어는 없지만 JVM이고 "상속되지 않은"상위 정의도로드하는 방식입니다.
실제로 부모를 변경할 수 있으며 하위 클래스는 여전히 작동합니다.
예를 들면 :
//A.java
class A {
private int i;
public String toString() { return ""+ i; }
}
// B.java
class B extends A {}
// Main.java
class Main {
public static void main( String [] args ) {
System.out.println( new B().toString() );
}
}
// Compile all the files
javac A.java B.java Main.java
// Run Main
java Main
// Outout is 0 as expected as B is using the A 'toString' definition
0
// Change A.java
class A {
public String toString() {
return "Nothing here";
}
}
// Recompile ONLY A.java
javac A.java
java Main
// B wasn't modified and yet it shows a different behaviour, this is not due to
// inheritance but the way Java loads the class
Output: Nothing here
정확한 용어는 여기에서 찾을 수 있습니다 . JavaTM Virtual Machine Specification