首页 > 编程语言 > 详细

黑马程序员——Java基础---内部类

时间:2015-11-29 19:33:57      阅读:309      评论:0      收藏:0      [点我收藏+]

      ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!-------

                                          内部类

内部类

   (1)成员内部类

         A:定义,:在一个外部类中有成员变量和成员方法,那么成员内部类就是把整个一个类当成了外部类的成员对待了

 

         B: 访问方式:内部类访问外部类,内部类可以直接访问外部类,包括私有成员,因为内部类拥有外部类的引用是类名.this

                       外部类访问内部类,外部类访问外部类的成员,必须要建立内部类的对象

                      格式:外部类名.内部类名 外部类对象.内部类对象;

                      Outer.Inner oi = new Outer().new Inner();//outer代表外部类,Inner代表内部类

          C:存放位置:在外部类里,在外部类的成员方法外.

          D:修饰符:finalabstractpublicprivateprotectedstatic,那么被static修饰的就是下面所说的

  (2)静态内部类

           A:定义,就是在成员内部类的基础上加上static

           B:格式:外部类名.内部类名 外部类名.内部类对象;

                  Outer.Inner oi = new Outer.Inner();

            C:存放位置:和成员内部类一样,就是多了个static

 (3)局部内部类

          A:定义,在外部类成员方法中定义的内部类,他更像局部变量 

         B: 注意:

             第一:方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

             第二:方法内部类对象不能使用该内部类所在方法的非final局部变量。因为方法的局部变量位于栈上,只存在于该方法的生命期内。

               当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!

               例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长

               所以内部类对象不能使用它们。

             第三:方法内部类的修饰符。与成员内部类不同,方法内部类更像一个局部变量。可以用于修饰方法内部类,的只有finalabstract

             第四:静态方法内的方法内部类。静态方法是没有this引用的,因此在静态方法内的内部类遭受同样的待遇,即:只能访问外部类的静态成员。

  (4)匿名内部类:

     没有名字的内部类。它是内部类的简化写法。是局部内部类的一种

      A:前提:内部类可以继承或实现一个外部类或者接口。

      B:格式为:new 外部类名或者接口名(){覆盖类或者接口中的抽象的方法,(也可以自定义内容。)}

      C:简单理解:就是建立一个带内容的外部类或者接口的子类的匿名对象。

      D: 匿名内部类几种常用方式

             a,继承式的匿名内部类

             b,接口式(也可以叫实现式的,名字无所谓)的匿名内部类

             c,参数式的匿名内部类

           多加一句:我的理解,其实与其说是匿名内部类,我个人认为说是匿名对象更确切一点(个人理解,仅供参考); 

 

  1 interface Inter {
  2 
  3 public abstract void show1();
  4 
  5 public abstract void show2();
  6 
  7 }
  8 
  9  
 10 
 11 //有名字的内部类
 12 
 13 class Outer {
 14 
 15 public void method(){
 16 
 17 class Inner implements Inter {
 18 
 19 public void show1(){
 20 
 21 System.out.println("show1");
 22 
 23 }
 24 
 25  
 26 
 27 public void show2(){
 28 
 29 System.out.println("show1");
 30 
 31 }
 32 
 33 }
 34 
 35 }
 36 
 37 public void show() {
 38 
 39 Inter in = new Inner();//父类引用指向子类对象
 40 
 41 in.show1();
 42 
 43 in.show2();
 44 
 45  
 46 
 47 }
 48 
 49 }
 50 
 51  
 52 
 53 //匿名内部类(重点,android里面用的多,awt的监听器用的多)
 54 
 55 class Outer {
 56 
 57 public void method() {
 58 
 59 //匿名内部类对象调用方法
 60 
 61 new Inter() {
 62 
 63 public void show1() {
 64 
 65 System.out.println("show1");
 66 
 67 }
 68 
 69  
 70 
 71 public void show2() {
 72 
 73 System.out.println("show1");
 74 
 75 }
 76 
 77 }.show1();
 78 
 79  
 80 
 81 new Inter() {
 82 
 83 public void show1() {
 84 
 85 System.out.println("show1");
 86 
 87 }
 88 
 89  
 90 
 91 public void show2(){
 92 
 93 System.out.println("show1");
 94 
 95 }
 96 
 97 }.show2();
 98 
 99 //匿名内部类对象的另一种调用方式,父类引用指向子类对象
100 
101 Inter in = new Inter() {
102 
103 public void show1() {
104 
105 System.out.println("show1");
106 
107 }
108 
109  
110 
111 public void show2() {
112 
113 System.out.println("show1");
114 
115 }
116 
117 };
118 
119 in.show1();
120 
121 in.show2();
122 
123 }
124 
125 }

(5)什么时候使用匿名内部类呢?

      A:通常在使用方法是接口类型参数,并该接口中的方法只有一个时,可以将匿名内部类作为参数传递。

                                                 -----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 

黑马程序员——Java基础---内部类

原文:http://www.cnblogs.com/hmchengxuyuan/p/5005178.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!