2017-01-13
成員內部類
局部內部類
匿名內部類
靜態內部類
在一個類的內部再創建一個類,成為內部類
1)在一個類中使用內部類,可以在內部類中直接存取所在類的私有屬性或方法
1 class Outer{
2 //外部類Outer
3 private int i = 111 ;//外部類私有變量
4 class Inner{
5 //內部類Inner
6 private int j = 222 ;//內部類私有變量
7 public void print(){
8 System.out.println("外部類的私有屬性"+ i);
9 System.out.println("內部類的私有屬性"+ j);
10 }
11 }
12 }
13 public class ClassDemo5 {
14 public static void main(String[] args) {
15 Outer o = new Outer() ;
16 Outer.Inner i = o.new Inner() ;
17 i.print() ;
18 }
19 }
2)內部類的實例化方法
import 面向對象基礎.Outer.Inner;
//第一種方式:導入import 面向對象基礎.Outer.Inner;包
Outer.Inner i = o.new Inner() ; //第二種方式:外部類.內部類 對象名 = 外部類對象.new 內部類
3)外部類訪問內部類
1 class Fatch{
2 //外部類Fatch
3 public class Student{
4 //內部類Student
5 public void show(){
6 //內部類show()方法
7 System.out.println("內部類Student的show()方法");
8 }
9 }
10 public void print(){
11 /**
12 * 外部類不可以直接訪問內部類的屬性或方法,
13 * 必須創建內部類對象才可以訪問
14 */
15 new Student().show() ; //使用匿名對象實例化調用內部類的類成員
16 System.out.println("外部類Fatch的print()方法");
17 }
18 }
19 public class ClassDemo4 {
20 public static void main(String[] args) {
21 Fatch f = new Fatch() ; //實例化外部類對象
22 f.print() ; //調用外部類的print()方法
23 }
24 }
4)如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關鍵字。
1 class Outer1 {
2 //外部類
3 private int i = 10 ;//外部類私有變量
4 class Inner1{
5 //內部類
6 private int i = 20 ;//內部類私有變量
7 public void show(){
8 //內部類方法
9 System.out.println("內部類的變量"+ this.i );//使用this關鍵字訪問內部類成員
10 System.out.println("外部類的變量"+ Outer1.this.i);//使用外部類名.this.變量名 來訪問外部類成員
11 }
12 }
13 public void print(){
14 new Inner1().show() ; //調用內部類方法
15 }
16 }
17 public class ClassDemo6 {
18 public static void main(String[] args) {
19 new Outer1().print() ;
20 }
21
22 }
•注意點:
»實例化內部類之前必須實例化外部類
»內部類可以隨意訪問他的外部類成員,但外部類不可以直接訪問內部類的類成員
»內部類可以被聲明為private 或 protected 權限的訪問
»內部類對象會依賴於外部類對象,除非已經存在一個外部類對象,否則類中不會出現內部類對象
內部類不僅可以在類中進行定義,也可以在類的局部位置進行定義,例如在類的方法或者任意的作用域中都可以定義內部類
1)在外部類的方法中定義一個方法內部類
1 class Demo1{
2 //外部類Demo
3 final int I = 10 ;//外部類定義的常量
4 public void show(){ //外部類的show()方法
5 class Inne{ //方法內部類
6 int j = 20 ; //方法內部類變量
7 private void inshow() { //方法內部類中的inshow()方法
8 System.out.println("外部類常量"+ I );
9 System.out.println("方法內部類變量"+ j );
10 }
11 }
12 Inne in = new Inne() ; //實例化內部類對象
13 in.inshow() ; //調用內部類方法
14 }
15 }
16 public class ClassDemo7 {
17 public static void main(String[] args) {
18 Demo1 d = new Demo1() ;
19 d.show() ;
20 }
21 }
注意:如果方法中的參數需要被傳遞進去,就必須把參數聲明成final類型
如果一個內部類被聲明為static,此內部類就稱為外部類
1)靜態內部類可以通過(new 外部類名.內部類.內部類方法名) ,來調用靜態內部類方法
1 class Outer2{
2 //外部類
3 private static String str = "張博傑" ;//外部類的靜態變量
4 static class Inner2{
5 //使用static聲明 的靜態內部類
6 public void fun() {
7 //靜態內部類方法
8 System.out.println("外部類的靜態變量"+" "+ str);
9 }
10 }
11 }
12 public class ClassDemo8 {
13 public static void main(String[] args) {
14 new Outer2.Inner2().fun() ;
15 //靜態內部類可以使用new 外部類名.內部類.內部類方法名 ,來調用靜態內部類方法
16 }
17 }
匿名內部類也就是沒有名字的內部類,正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫.使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口
1)匿名內部類的實現
1 abstract class A2 { //抽象類A2
2 public abstract void eat() ;
3 }
4 public class ClassDemo9 {
5 public static void main(String[] args) {
6 /**
7 * 如果A2這個抽象類只用一次,那麼就可一使用匿名內部類來實現
8 */
9 A2 a = new A2(){
10 public void eat(){
11 System.out.println("我要吃飯");
12 }
13 } ;
14 a.eat() ;
15 }
16 }