Następujący program używa wewnętrznej klasy o nazwie Anonymous
, która sama rozszerza swoją klasę obejmującą Main
.Skręcona klasa wewnętrzna w języku Java
package name;
public class Main
{
private final String name;
Main(String name)
{
this.name = name;
}
private String name()
{
return name;
}
private void reproduce()
{
new Anonymous().printName();
}
private class Anonymous extends Main
{
public Anonymous()
{
super("reproduce");
}
public void printName()
{
System.out.println(name());
}
}
public static void main(String[] args)
{
new Main("main").reproduce();
}
}
Jedyne oświadczenie w głównej() metoda wywołuje konstruktor klasy zewnętrznej Main
dostarczającego ciąg główny i tylko wtedy metoda reproduce()
jest nazywany.
The reproduce method
zawiera oświadczenie new Anonymous().printName();
który wywołuje metodę printName()
na obiekcie Anonymous
klasy. Konstruktor super();
dostarcza nowy ciąg odtwarzający do swojej superklasy klasy Main
.
W związku z tym stwierdzenie w sposób printName
System.out.println(name());
powinien wyświetlać ciąg rozmnażać zamiast głównej ale zawsze wyświetla ciąg główny. Dlaczego tak jest?
+1 Dobrze zauważony. – skaffman