Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152132
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-23 14:38
文章分类

全部博文(47)

文章存档

2017年(7)

2016年(4)

2015年(19)

2014年(17)

我的朋友

分类: Java

2015-09-06 20:28:57

内部类应该算是java与C++比较大的差别之一了,因为C++没有内部类。内部类顾名思义是定义在类的内部的类。根据具体位置和表现形式可分为:1.成员内部类
          2.局部内部类
          3.匿名内部类
          4.静态内部类(嵌套类)
一。成员内部类

点击(此处)折叠或打开

  1. public class InnerTest {
  2.     String a = "i am in outer";
  3.     class Inner{
  4.         private String s = "I am private in Inner";
  5.         void f(){System.out.print(a);}
  6.         
  7.     }
  8.     
  9.     public void g(){}
  10.     public static void main(String[] args) {
  11.         InnerTest outer = new InnerTest();
  12.         InnerTest.Inner inner = outer.new Inner();
  13.         inner.f();
  14.     }
  15. }
这属于最基本的内部类,内部类可以访问外部类的所有属性的字段和方法。此时的内部类和外部类是相互绑定的,也就是说创建内部类对象时必须先创建外部类的对象。

二。局部内部类
局部内部类是定义在方法内的类,因为是局部的所以只能在该方法内实例化内部类并调用相应方法

点击(此处)折叠或打开

  1. public class InnerTest {
  2.     String a = "i am in outer";

  3.     public void g(){
  4.         int b=2;
  5.         final int c=3;
  6.         class Inner{
  7.             public String s = "I am private in Inner";
  8.             void f(){System.out.print(a);}
  9. //            void k(){System.out.print(b);} //无法通过,只能访问方法中的final局部变量
  10.             void j(){System.out.print(c);}
  11.         }
  12.         new Inner().f();
  13.     }
  14.     public static void main(String[] args) {
  15.         InnerTest outer = new InnerTest();
  16.         outer.g();
  17.     }
  18. }

三。匿名内部类

点击(此处)折叠或打开

  1. public class InnerTest {
  2.     static String a = "i am in outer";

  3.     public static void main(String[] args) {
  4.         InnerTest outer = new InnerTest();
  5.         new Thread(task).run();
  6.     }
  7.     
  8.     static Runnable task = new Runnable() {
  9.         
  10.         @Override
  11.         public void run() {
  12.             // TODO Auto-generated method stub
  13.             System.out.print(a);
  14.         }
  15.         
  16.     };
  17. }
简单的多线程,实例化一个Runnable,用Thread启动。也许你看到的时候会很困惑,Runnable不是接口么?为什么可以实例化一个接口,这不与书上的理论矛盾么。这其实就是匿名内部类的运用,匿名内部类表征一个没有名字的类,它实际上相当于一个内部类实现该接口,然后再实例化一个内部类对象。

点击(此处)折叠或打开

  1. public class InnerTest {
  2.     static String a = "i am in outer";

  3.     public static void main(String[] args) {
  4.         InnerTest outer = new InnerTest();
  5.         new Thread(outer.new Task()).run();
  6.         
  7.     }
  8.     
  9.     /*static Runnable task = new Runnable() {
  10.         
  11.         @Override
  12.         public void run() {
  13.             // TODO Auto-generated method stub
  14.             System.out.print(a);
  15.         }
  16.         
  17.     };*/
  18.     
  19.     class Task implements Runnable{
  20.         public void run() {
  21.             System.out.print(a);
  22.         }
  23.     }
  24.     
  25. }
当你接触android时会发现里面有很多匿名内部类的使用,比如各种控件的onClickListner监听器的注册。

点击(此处)折叠或打开

  1. stopButton = (Button)findViewById(R.id.stopButton);
  2.         stopButton.setEnabled(false);
  3.         stopButton.setOnClickListener(new View.OnClickListener() {
  4.             
  5.             @Override
  6.             public void onClick(View arg0) {
  7.                 // TODO Auto-generated method stub
  8.                 stopShow();
  9.             }
  10.         });
四。嵌套类
嵌套类带static标志,我们知道static表明它是与对象无关的,不管对象存在与否它都存在,它也只能访问外部类的static变量和方法,而前面的成员内部类是需要与外部类对象绑定的。

点击(此处)折叠或打开

  1. public class InnerTest {
  2.     static String a = "i am in outer";

  3.     public static void main(String[] args) {
  4. //        InnerTest outer = new InnerTest(); //无需再实例化外部类
  5.         InnerTest.Inner inner = new InnerTest.Inner();
  6.         inner.f();
  7.     }

  8.     static class Inner{
  9.         void f(){System.out.print(a);}
  10.     }
  11. }
总结:内部类是一种代码隐藏机制,也为多继承提供了新的方式(接口加内部类的组合)。深入的探讨待以后的学习工作过程中继续完成。






阅读(1036) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~