浅谈java内部类的用法

学习自:

http://www.cnblogs.com/chenssy/p/3388487.html

http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html

  1. 定义:内部类是指在一个外部类的内部再定义一个类
  2. 特性:

a)       内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)

b)       内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

  1. 内部类的四种用法

a)       成员内部类

                     i.            成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取

                   ii.            成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的

                  iii.            在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;

                  iv.            而需要创建内部类对象,可以使用outer.inner  obj = outerobj.new inner();

                   v.            举例:

  1.  
  2. public class Outer {
  3.     public static void main(String[] args) {
  4.         Outer outer = new Outer();
  5.         Outer.Inner inner = outer.new Inner();
  6.         inner.print("Outer.new");
  7.  
  8.         inner = outer.getInner();
  9.         inner.print("Outer.get");
  10.     }
  11.     // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时
  12.     public Inner getInner() {
  13.         return new Inner();
  14.     }
  15.     public class Inner {
  16.         public void print(String str) {
  17.             System.out.println(str);
  18.         }
  19.     }
  20. }

b)       局部内部类

                     i.            局部内部类,是指内部类定义在方法和作用域内

                   ii.            局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

                  iii.            举例:

  1. 定义在方法内

a)   public class Parcel4 { 

b)       public Destination destination(String s) { 

c)           class PDestination implements Destination { 

d)               private String label; 

e)    

f)               private PDestination(String whereTo) { 

g)                   label = whereTo; 

h)               } 

i)    

j)               public String readLabel() { 

k)                   return label; 

l)               } 

m)           } 

n)           return new PDestination(s); 

  • o)       } 

p)    

q)       public static void main(String[] args) { 

r)           Parcel4 p = new Parcel4(); 

s)           Destination d = p.destination("Tasmania"); 

t)       } 

u)   } 

  1. 定义在作用域里

a)       public class Parcel5 {

b)           private void internalTracking(boolean b) {

c)                if (b) {

d)                   class TrackingSlip {

e)                       private String id;

f)                        TrackingSlip(String s) {

g)                           id = s;

h)                       }

i)                         String getSlip() {

j)                             return id;

k)                        }

l)                     }

m)                  TrackingSlip ts = new TrackingSlip("slip");

n)                   String s = ts.getSlip();

  • o)               }

p)           }

q)        

r)            public void track() {

s)                internalTracking(true);

t)            }

u)        

v)            public static void main(String[] args) {

w)              Parcel5 p = new Parcel5();

x)                p.track();

y)            }

z)        }

c)        嵌套内部类

                     i.            嵌套内部类,就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。

                   ii.            嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。而嵌套类不能声明为private,一般声明为public,方便调用

d)       匿名内部类

                     i.            匿名内部类也就是没有名字的内部类

                   ii.            匿名内部类是不能加访问修饰符的

                  iii.            举例

  1. Thread类的匿名内部类实现

a)       public class Demo {

b)           public static void main(String[] args) {

c)                Thread t = new Thread() {

d)                   public void run() {

e)                       for (int i = 1; i <= 5; i++) {

f)                            System.out.print(i + " ");

g)                       }

h)                   }

i)                 };

j)                 t.start();

k)            }

l)         }

  1. Runnable接口的匿名内部类实现

a)       public class Demo {

b)           public static void main(String[] args) {

c)                Runnable r = new Runnable() {

d)                   public void run() {

e)                       for (int i = 1; i <= 5; i++) {

f)                            System.out.print(i + " ");

g)                       }

h)                   }

i)                 };

j)                 Thread t = new Thread(r);

k)                t.start();

l)             }

m)      }

e)       内部类的继承

                     i.            内部类的继承,是指内部类被继承,普通类 extents 内部类。而这时候代码上要有点特别处理,具体看以下例子:

                   ii.            类的构造函数里面要使用父类的外部类对象.super();而这个对象需要从外面创建并传给形参。

  1. public class InheritInner extends WithInner.Inner {
  2.  
  3.     // InheritInner() 是不能通过编译的,一定要加上形参
  4.     InheritInner(WithInner wi) {
  5. 5.               wi.super();
  6.     }
  7.  
  8.     public static void main(String[] args) {
  9.         WithInner wi = new WithInner();
  10.         InheritInner obj = new InheritInner(wi);
  11.     }
  12. }
  13.  
  14. class WithInner {
  15.     class Inner {
  16.  
  17.     }
  18. }
posted @ 2017-10-10 09:15  熊窝窝  阅读(186)  评论(0编辑  收藏  举报