定義:放在一個(gè)類的內(nèi)部的類我們就叫內(nèi)部類。
在java中,可以將一個(gè)類定義在另一個(gè)類里面或者一個(gè)方法里面,這樣的類稱為內(nèi)部類。內(nèi)部類仍然是一個(gè)獨(dú)立的類,在編譯之后內(nèi)部類會(huì)被編譯成獨(dú)立的.class文件,但是前面冠以外部類的類名和$符號(hào)。
內(nèi)部類是一個(gè)編譯時(shí)的概念,一旦編譯成功,就會(huì)成為完全不同的兩類。對(duì)于一個(gè)名為outer的外部類和其內(nèi)部定義的名為inner的內(nèi)部類。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類。所以內(nèi)部類的成員變量/方法名可以和外部類的相同。
內(nèi)部類可以是靜態(tài)static的,也可用public,default,PRotected和private修飾。(而外部頂級(jí)類即類名和文件名相同的只能使用public和default
分類:1.成員內(nèi)部類2.靜態(tài)內(nèi)部類 3.匿名內(nèi)部類 4.方法內(nèi)部類(幾乎不用)
作用:間接解決多重繼承的問題(內(nèi)部類繼承一個(gè)類,外部類繼承一個(gè)類,實(shí)現(xiàn)多繼承。最重要的作用);
內(nèi)部類擁有外圍類的所有元素的訪問權(quán)限;
成員內(nèi)部類,顧名思義,就是在一個(gè)類的內(nèi)部定義一個(gè)類,作為類的一個(gè)成員屬性(成員字段),類的成員內(nèi)部類可以訪問該類的屬性和方法,因?yàn)樗彩窃擃惖囊粋€(gè)成員。
要注意的是,成員內(nèi)部類不能含有static的變量和方法。因?yàn)槌蓡T內(nèi)部類需要先創(chuàng)建了外部類,才能創(chuàng)建它自己的,了解這一點(diǎn),就可以明白更多事情,在此省略更多的細(xì)節(jié)了。
上代碼:
package 內(nèi)部類.成員內(nèi)部類;public class Person {public void sayPerson(){System.out.println("hello Person");}}
package 內(nèi)部類.成員內(nèi)部類;public class Student extends Person {private int age;public int getAge(){return age;}public void say(){System.out.println("hello Student");}private Grade1 getGrade1() { return new Grade1(); //建議用這種方式實(shí)例化 } private class Grade1{public void say(){Student.this.sayPerson();//內(nèi)部類調(diào)用外部類的成員Student.this.say();System.out.println(Student.this.getAge());System.out.println("hello Grade1");}}public static void main(String[] args) {Student stu = new Student();Student.Grade1 grade1 = stu.getGrade1();//Student.Grade1 grade2 = stu.new Grade1();兩種實(shí)例化內(nèi)部類的方式grade1.say();}}
靜態(tài)內(nèi)部類:顧名思義內(nèi)部類是靜態(tài)的,這樣的好處是不用拿到外部類對(duì)象就可以實(shí)例化內(nèi)部類了,但是這樣的話,內(nèi)部類就不能引用外部類的非靜態(tài)成員了(人無完人?。?/p>
上代碼 eg:HashMap 中的 Entry
package 內(nèi)部類.靜態(tài)內(nèi)部類;public class Test { public int age=1; public static String name="shaolin"; static class Baby{ //靜態(tài)內(nèi)部類 public void say() { //System.out.println(age);不能訪問age屬性,只能訪問靜態(tài)屬性(很容易理解) System.out.println("hello "+name); } } public static void main(String[] args) { Test.Baby temp=new Test.Baby(); //實(shí)例化靜態(tài)內(nèi)部類 temp.say(); } }
匿名內(nèi)部類,顧名思義就是沒有名字的內(nèi)部類
上代碼
package 內(nèi)部類.匿名內(nèi)部類;public class Test { public static void main(String[] args) { //相當(dāng)繼承Mother類并實(shí)現(xiàn)抽象方法 Person person=new Person(){@Overridepublic void say() {System.out.println("hello,匿名內(nèi)部類");} }; person.say(); } } abstract class Person{ //也可以是一個(gè)interface的 public abstract void say(); }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注