内部类应该算是java与C++比较大的差别之一了,因为C++没有内部类。内部类顾名思义是定义在类的内部的类。根据具体位置和表现形式可分为:1.成员内部类
2.局部内部类
3.匿名内部类
4.静态内部类(嵌套类)
一。成员内部类
-
public class InnerTest {
-
String a = "i am in outer";
-
class Inner{
-
private String s = "I am private in Inner";
-
void f(){System.out.print(a);}
-
-
}
-
-
public void g(){}
-
public static void main(String[] args) {
-
InnerTest outer = new InnerTest();
-
InnerTest.Inner inner = outer.new Inner();
-
inner.f();
-
}
-
}
这属于最基本的内部类,内部类可以访问外部类的所有属性的字段和方法。此时的内部类和外部类是相互绑定的,也就是说创建内部类对象时必须先创建外部类的对象。
二。局部内部类
局部内部类是定义在方法内的类,因为是局部的所以只能在该方法内实例化内部类并调用相应方法
-
public class InnerTest {
-
String a = "i am in outer";
-
-
public void g(){
-
int b=2;
-
final int c=3;
-
class Inner{
-
public String s = "I am private in Inner";
-
void f(){System.out.print(a);}
-
// void k(){System.out.print(b);} //无法通过,只能访问方法中的final局部变量
-
void j(){System.out.print(c);}
-
}
-
new Inner().f();
-
}
-
public static void main(String[] args) {
-
InnerTest outer = new InnerTest();
-
outer.g();
-
}
-
}
三。匿名内部类
-
public class InnerTest {
-
static String a = "i am in outer";
-
-
public static void main(String[] args) {
-
InnerTest outer = new InnerTest();
-
new Thread(task).run();
-
}
-
-
static Runnable task = new Runnable() {
-
-
@Override
-
public void run() {
-
// TODO Auto-generated method stub
-
System.out.print(a);
-
}
-
-
};
-
}
简单的多线程,实例化一个Runnable,用Thread启动。也许你看到的时候会很困惑,Runnable不是接口么?为什么可以实例化一个接口,这不与书上的理论矛盾么。这其实就是匿名内部类的运用,匿名内部类表征一个没有名字的类,它实际上相当于一个内部类实现该接口,然后再实例化一个内部类对象。
-
public class InnerTest {
-
static String a = "i am in outer";
-
-
public static void main(String[] args) {
-
InnerTest outer = new InnerTest();
-
new Thread(outer.new Task()).run();
-
-
}
-
-
/*static Runnable task = new Runnable() {
-
-
@Override
-
public void run() {
-
// TODO Auto-generated method stub
-
System.out.print(a);
-
}
-
-
};*/
-
-
class Task implements Runnable{
-
public void run() {
-
System.out.print(a);
-
}
-
}
-
-
}
当你接触android时会发现里面有很多匿名内部类的使用,比如各种控件的onClickListner监听器的注册。
-
stopButton = (Button)findViewById(R.id.stopButton);
-
stopButton.setEnabled(false);
-
stopButton.setOnClickListener(new View.OnClickListener() {
-
-
@Override
-
public void onClick(View arg0) {
-
// TODO Auto-generated method stub
-
stopShow();
-
}
-
});
四。嵌套类
嵌套类带static标志,我们知道static表明它是与对象无关的,不管对象存在与否它都存在,它也只能访问外部类的static变量和方法,而前面的成员内部类是需要与外部类对象绑定的。
-
public class InnerTest {
-
static String a = "i am in outer";
-
-
public static void main(String[] args) {
-
// InnerTest outer = new InnerTest(); //无需再实例化外部类
-
InnerTest.Inner inner = new InnerTest.Inner();
-
inner.f();
-
}
-
-
static class Inner{
-
void f(){System.out.print(a);}
-
}
-
}
总结:内部类是一种代码隐藏机制,也为多继承提供了新的方式(接口加内部类的组合)。深入的探讨待以后的学习工作过程中继续完成。
阅读(1071) | 评论(0) | 转发(0) |