public class UnSafeSequence {
public class TestMath{
private TestMath(){
System.out.println("父类实例化");
}
}
public class TestMath1 extends TestMath{
public TestMath1(){
System.out.println("子类实例化");
}
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new UnSafeSequence().new TestMath1());
}
}
Perihalan pengubah suai peribadi dalam spesifikasi bahasa Java 6, takrif kelas peringkat atas dan kelas dalaman
6.6.1 jika ahli atau pembina diisytiharkan peribadi, maka akses dibenarkan jika dan hanya jika ia berlaku dalam badan kelas peringkat atas (§7.6) yang menyertakan pengisytiharan ahli atau pembina. Jika ahli atau pembina kelas diisytiharkan peribadi, maka hanya kelas peringkat atasan yang mengisytiharkan ahli atau pembina mempunyai akses (sudah tentu kelas yang mengisytiharkan ahli dan pembina juga boleh diakses)
8. Kelas peringkat atas ialah kelas yang bukan kelas bersarang. Kelas bersarang ialah mana-mana kelas yang pengisytiharannya berlaku dalam badan kelas atau antara muka lain yang bukan kelas bersarang. Kelas peringkat atas bukan kelas bersarang (kelas dalam) Kelas bersarang (kelas dalam) ialah kelas yang diisytiharkan dalam kelas atau antara muka lain
Memandangkan penerangan di atas, kelas luaran boleh mengakses kelas dalaman TestMath yang pembinanya ditandakan sebagai peribadi. TestMath1 juga merupakan kelas dalaman, yang mewarisi kelas dalaman lain TestMath Kerana kelas dalaman bergantung pada objek contoh kelas luaran untuk wujud, ia akan dikaitkan secara tersirat dengan tika kelas luaran jadi
.
public class TestMath1 extends TestMath{
public TestMath1(){
System.out.println("子类实例化");
}
}
boleh ditulis sebagai
public class TestMath1 extends UnSafeSequence.TestMath{
public TestMath1(){
UnSafeSequence.this.super();
System.out.println("子类实例化");
}
}
Ini boleh menerangkan sebab subkelas kelas dalam boleh mengakses pembina peribadi kelas induknya
Secara umumnya, subkelas tidak boleh memanggil pembina peribadi kelas induk. Dua kelas yang anda ada di sini ialah kedua-dua kelas dalaman ahli kelas yang sama Kelas dalaman boleh mengakses pembolehubah ahli kelas luar secara bebas, walaupun ia peribadi. Oleh itu, kelas dalaman ahli boleh mengakses kelas dalaman ahli yang lain (kerana ia boleh dianggap sebagai pembolehubah ahli), dan kelas dalaman ahli yang diakses tidak dilindungi sepenuhnya daripada kelas dalaman ahli yang mengaksesnya.
Kelas dalaman boleh mengakses kaedah dan medan peribadi mana-mana kelas luaran TestMath1 mewarisi TestMath sendiri sebagai kelas dalaman UnSafeSequence, jadi TestMath1 boleh mengakses mana-mana kaedah dan medan peribadi yang ditakrifkan dalam UnSafeSequence, termasuk kaedah dan medan peribadi dalam TestMath. padang.
Jika anda mentakrifkan TestMath secara berasingan di luar UnSafeSequence, maka TestMath1 tidak boleh mengakses kaedah dan medan peribadi dalam TestMath.
Perihalan pengubah suai peribadi dalam spesifikasi bahasa Java 6, takrif kelas peringkat atas dan kelas dalaman
Memandangkan penerangan di atas, kelas luaran boleh mengakses kelas dalaman TestMath yang pembinanya ditandakan sebagai peribadi.
.TestMath1 juga merupakan kelas dalaman, yang mewarisi kelas dalaman lain TestMath Kerana kelas dalaman bergantung pada objek contoh kelas luaran untuk wujud, ia akan dikaitkan secara tersirat dengan tika kelas luaran
jadi
boleh ditulis sebagai
Ini boleh menerangkan sebab subkelas kelas dalam boleh mengakses pembina peribadi kelas induknya
Secara umumnya, subkelas tidak boleh memanggil pembina peribadi kelas induk.
Dua kelas yang anda ada di sini ialah kedua-dua kelas dalaman ahli kelas yang sama Kelas dalaman boleh mengakses pembolehubah ahli kelas luar secara bebas, walaupun ia peribadi. Oleh itu, kelas dalaman ahli boleh mengakses kelas dalaman ahli yang lain (kerana ia boleh dianggap sebagai pembolehubah ahli), dan kelas dalaman ahli yang diakses tidak dilindungi sepenuhnya daripada kelas dalaman ahli yang mengaksesnya.
Kelas dalaman boleh mengakses kaedah dan medan peribadi mana-mana kelas luaran TestMath1 mewarisi TestMath sendiri sebagai kelas dalaman UnSafeSequence, jadi TestMath1 boleh mengakses mana-mana kaedah dan medan peribadi yang ditakrifkan dalam UnSafeSequence, termasuk kaedah dan medan peribadi dalam TestMath. padang.
Jika anda mentakrifkan TestMath secara berasingan di luar UnSafeSequence, maka TestMath1 tidak boleh mengakses kaedah dan medan peribadi dalam TestMath.