1. 成员内部类 成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。
在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;
而需要创建内部类对象,可以使用outer.inner obj = outerobj.new inner();- public class Outer {
- public static void main(String[] args) {
- Outer outer = new Outer();
- Outer.Inner inner = outer.new Inner();
- inner.print("Outer.new");
-
- inner = outer.getInner();
- inner.print("Outer.get");
- }
-
- // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时
- public Inner getInner() {
- return new Inner();
- }
-
- public class Inner {
- public void print(String str) {
- System.out.println(str);
- }
- }
- }
复制代码 2. 局部内部类 局部内部类,是指内部类定义在方法和作用域内。Thinking in Java给了这么两个例子:
定义在方法内:- public class Parcel4 {
- public Destination destination(String s) {
- class PDestination implements Destination {
- private String label;
-
- private PDestination(String whereTo) {
- label = whereTo;
- }
-
- public String readLabel() {
- return label;
- }
- }
- return new PDestination(s);
- }
-
- public static void main(String[] args) {
- Parcel4 p = new Parcel4();
- Destination d = p.destination("Tasmania");
- }
- }
复制代码 3. 匿名内部类- ((Button) findViewById(R.id.start)).setOnClickListener(new Button.OnClickListener() {
- @Override
- public void onClick(View v) {
- new Thread() {
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- }
-
- }.start();
- }
- });
复制代码 匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的,看下面例子:- public class Outer {
- public static void main(String[] args) {
- Outer outer = new Outer();
- Inner inner = outer.getInner("Inner", "gz");
- System.out.println(inner.getName());
- }
-
- public Inner getInner(final String name, String city) {
- return new Inner() {
- private String nameStr = name;
-
- public String getName() {
- return nameStr;
- }
- };
- }
- }
-
- //注释后,编译时提示类Inner找不到
- /* interface Inner {
- String getName();
- } */
复制代码 4.内部类的继承 内部类的继承,是指内部类被继承,普通类 extents 内部类。而这时候代码上要有点特别处理,具体看以下例子:
- public class InheritInner extends WithInner.Inner {
-
- // InheritInner() 是不能通过编译的,一定要加上形参
- InheritInner(WithInner wi) {
- wi.super();
- }
-
- public static void main(String[] args) {
- WithInner wi = new WithInner();
- InheritInner obj = new InheritInner(wi);
- }
- }
-
- class WithInner {
- class Inner {
-
- }
- }
复制代码
|
|