黑马程序员技术交流社区
标题:
Java内部类的使用小结
[打印本页]
作者:
别想太多
时间:
2015-5-26 08:59
标题:
Java内部类的使用小结
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 {
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2