Hayır. Miras almıyorlar.
Başka bir sınıfın onu dolaylı olarak kullanabilmesi, kalıtım hakkında değil, kapsülleme hakkında hiçbir şey söylemez.
Örneğin:
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?
}
}
Yansıtma yoluyla count
içerideki değeri de elde edebilirsiniz UseIt
. Bu, kalıtımsal olduğunuz anlamına gelmez.
GÜNCELLEME
Değer orada olmasına rağmen, alt sınıf tarafından miras alınmaz.
Örneğin, şu şekilde tanımlanan bir alt sınıf:
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?
}
}
Bu, ilk örnekle tamamen aynı durumdur. Özellik count
gizlidir, değil alt sınıf tarafından miras alınmaz. Yine de, DigitalRoss'un belirttiği gibi, değer oradadır, ancak miras yoluyla değil.
Bu tarafa koy. Babanız zenginse ve size kredi kartı veriyorsa, hala parasıyla bir şeyler satın alabilirsiniz, ancak miras aldığınız anlamına gelmez tüm bu parayı , değil mi?
Diğer güncelleme
Yine de çok ilginç, bu özelliğin neden orada olduğunu bilmek .
Açıkçası bunu tanımlamak için kesin bir terime sahip değilim, ama JVM ve aynı zamanda "kalıtsal olmayan" üst tanımını da yükleyen çalışma şekli.
Ebeveyni gerçekten değiştirebiliriz ve alt sınıf yine de çalışır.
Örneğin :
//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
Sanırım tam terim burada bulunabilir: JavaTM Sanal Makine Özellikleri