cari

Rumah  >  Soal Jawab  >  teks badan

java - 为什么子类可以调用父类的私有构造方法

高洛峰高洛峰2887 hari yang lalu420

membalas semua(3)saya akan balas

  • PHP中文网

    PHP中文网2017-04-17 17:52:33

    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

    balas
    0
  • 怪我咯

    怪我咯2017-04-17 17:52:33

    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.

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:52:33

    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.

    balas
    0
  • Batalbalas