内部类学习笔记


过年无聊吧java的内部类复习了一下,把学习的总结拿出来分享,也当时做个备份,以便日后查阅

一、演示内部类定义在成员位置上

[java]  view plain copy
 
  1. /** 
  2.  * 一、演示内部类定义在成员位置上 
  3.  * */  
  4. public class InnerDemo1 {  
  5.     //成员变量  
  6.     int num = 8;  
  7.     //定义一个内部类  
  8.     class Inner{  
  9.         //内部类中的一个方法  
  10.         void show(){  
  11.             System.out.println(num);  
  12.         }  
  13.     }  
  14.     /** 
  15.      * 创建内部类调用其方法 
  16.      */  
  17.     public static void main(String[] args) {  
  18.         /* 
  19.          * 创建内部类的格式 
  20.          * 外部类名.内部类名 对象名 = 外部类对象.内部类对象 
  21.          */  
  22. //      使用Inner直接引用内部类也可以,但是最好用(外部类名.内部类名)的方式,便于区分同名的内部类  
  23. //      Inner inner = new InnerDemo1().new Inner();,  
  24.         InnerDemo1.Inner inner = new InnerDemo1().new Inner();  
  25.         inner.show();//调用show()方法。  
  26.           
  27.     }  
  28.   
  29. }  

 二、演示内部类中访问变量的方式

[java]  view plain copy
 
  1. /** 
  2.  * 二、演示内部类中访问变量的方式 
  3.  * */  
  4. public class InnerDemo2 {  
  5.     //外部类中的成员变量  
  6.     int num = 8;  
  7.     class Inner{  
  8.         //内部类的成员变量  
  9.         int num = 7;  
  10.         void show(){  
  11.             //内部类的局部变量  
  12.             int num = 6;  
  13.             System.out.println(num);//6 不指定所属,则指向的是该方法中局部的同名变量  
  14.             System.out.println(this.num);//7 this代表内部类,指向的用于指定内部类的成员变量  
  15.             System.out.println(InnerDemo2.this.num);//8  外部类名.this.变量名,指向的是外部类的成员变量  
  16.         }  
  17.     }  
  18.     public static void main(String[] args) {  
  19.         InnerDemo2.Inner inner = new InnerDemo2().new Inner();  
  20.         inner.show();  
  21.     }  
  22.   
  23. }  

 三、演示静态内部类

[java]  view plain copy
 
  1. /** 
  2.  * 三、演示静态内部类 
  3.  * */  
  4. public class InnerDemo3 {  
  5.     /* 
  6.      * 静态内部类访问的外部类的成员变量也要试静态的。 
  7.      * 即静态内部类只能访问外部类的静态成员 
  8.      */  
  9.     static int num = 8;  
  10.     /**静态内部类*/  
  11.     static class Inner{  
  12.         /**非静态方法*/  
  13.         void show(){  
  14.             System.out.println(num);  
  15.         }  
  16.         /**静态方法*/  
  17.         static void run(){  
  18.             System.out.println("Inner calss method run");  
  19.         }  
  20.     }  
  21.     public static void main(String[] args) {  
  22.         /* 
  23.          * 创建静态内部类的格式 
  24.          * 外部类名.内部类名 对象名 = new 外部类名.内部类名(); 
  25.          */  
  26.         InnerDemo3.Inner inner = new InnerDemo3.Inner();  
  27.         //调用非静态方法  
  28.         inner.show();  
  29.         //调用静态方法  
  30. //      inner.run();  
  31.         InnerDemo3.Inner.run();//直接通过类名调用  
  32.     }  
  33.   
  34. }  

 四、演示匿名内部类

[java]  view plain copy
 
  1. /** 
  2.  * 四、演示匿名内部类 
  3.  *      匿名内部类就是没有名字的内部类 
  4.  *      好处:简化了内部类的书写。 
  5.  *      前提:内部类必须要继承或者实现一个外部类或外部接口  
  6.  * 
  7.  */  
  8. interface MyInterface{  
  9.     void show();  
  10. }  
  11. public class AnonymousClassDemo1 {  
  12.     /** 
  13.      * 创建匿名内部类并调用其方法 
  14.      * new MyInterface(){...}创建的是接口的实现类,即子类 
  15.      * */  
  16.     public static void method(){  
  17.         //创建一个MyInterface接口的匿名内部类,覆盖其为实现的方法,并调用其方法  
  18.         new MyInterface(){  
  19.             @Override  
  20.             public void show() {  
  21.                 System.out.println("show");  
  22.             }  
  23.         }.show();  
  24.           
  25.     }  
  26.     /** 
  27.      * 使用接口引用该匿名内部类 
  28.      * 父类引用子类对象 
  29.      * */  
  30.     public static void method2(){  
  31.         //创建一个MyInterface接口的匿名内部类,覆盖其为实现的方法,并起个名字  
  32.         MyInterface inter = new MyInterface(){  
  33.             @Override  
  34.             public void show() {  
  35.                 System.out.println("show2");  
  36.             }  
  37.         };  
  38.         //调用show方法  
  39.         inter.show();  
  40.     }  
  41.     /** 
  42.      * 在匿名内部类中添加新方法 
  43.      */  
  44.     public static void method3(){  
  45.         new Object(){  
  46.             //添加子类特有的方法  
  47.             void run(){  
  48.                 System.out.println("run");  
  49.             }  
  50.         }.run();  
  51.     }  
  52.     /** 
  53.      * 内部类的错误使用 
  54.      * */  
  55.     public static void method4(){  
  56.         Object obj = new Object(){  
  57.             //添加子类特有的方法  
  58.             void run(){  
  59.                 System.out.println("run");  
  60.             }  
  61.         };  
  62.         //编译不通过,Object中找不到run()方法  
  63. //      obj.run();  
  64.     }  
  65.     /** 
  66.      * 内部类的应用 
  67.      * 使用内部类来调用覆盖后的方法 
  68.      */  
  69.     public static void method5(){  
  70.         Object obj = new Object(){  
  71.             @Override  
  72.             public String toString() {  
  73.                 String s = "覆盖了Object中的toString方法";  
  74.                 return s;  
  75.             }  
  76.         };  
  77.         //调用覆盖后的toString方法  
  78.         System.out.println(obj.toString());  
  79.     }  
  80.     /** 
  81.      * 内部类访问局部变量 
  82.      * 为什么用final修饰局部变量? 
  83.      * 简单说就是因为局部内部类是在内存栈中,方法执行完局部变量就会出栈, 
  84.      * 而局部内部类还持有局部变量的引用,jvm就会出现异常,这和jvm的设计 
  85.      * 有关,在底层会把final修饰的局部变量在方法执行完复制一份到内部类 
  86.      * 中继续保留对该变量的引用。 
  87.      *  
  88.      */  
  89.     public static void method6(final int a){  
  90.         final int b = 9;  
  91.         new Object(){  
  92.             /** 
  93.              * 局部内部类中访问的方法参数要用final修饰 
  94.              */  
  95.             void show(){  
  96.                 System.out.println(a);  
  97.             }  
  98.             /** 
  99.              * 局部内部类中访问的局部变量要被final修饰 
  100.              */  
  101.             void add(){  
  102.                 System.out.println(a+b);  
  103.             }  
  104.         };  
  105.     }  
  106.     public static void main(String[] args) {  
  107.         method();  
  108.         method2();  
  109.         method3();  
  110.         method4();  
  111.         method5();  
  112.     }  
  113.   
  114. }  

 五、内部类面试题

[java]  view plain copy
 
  1. /** 
  2.  * 五、内部类面试题 
  3.  *      给出一个接口Inter,要求Outers.method().show();能执行, 
  4.  *      要求补全Outers类中的代码用匿名内部类 
  5.  *      interface Inter{ 
  6.                 void show(); 
  7.         } 
  8.         class Outers{ 
  9.             //TODO 
  10.         } 
  11.          
  12.         public static void main(String[] args) { 
  13.             Outers.method().show(); 
  14.         } 
  15.  * 
  16.  */  
  17. interface Inter{  
  18.     void show();  
  19. }  
  20. class Outers{  
  21.     static Inter method(){  
  22.         return new Inter(){  
  23.             @Override  
  24.             public void show() {  
  25.                 System.out.println("hello");  
  26.             }  
  27.         };  
  28.     }  
  29. }  
  30. public class InnerTest {  
  31.   
  32.     public static void main(String[] args) {  
  33.         Outers.method().show();  
  34.         /* 
  35.          *分析: 
  36.          *   1: Outers.method()说明method()是静态的。 
  37.          *   2: Outers.method().show();说明调用method方法返回的是Inter接口的子类对象 
  38.          */  
  39.   
  40.     }  
  41.   
  42. }  
  43.  
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值