文章摘要
1、内部类按照类别可以分为:非静态成员内部类、局部内部类、静态成员内部类、匿名内部类。
2、非静态内部类相当于外部类的非静态成员属性以及方法,含有外部对象的引用。
3、非静态内部类不允许定义静态成员变量,但是可以存在静态常量。
一、内部类综述
1、内部类按照类别可以分为:非静态成员内部类、局部内部类、静态成员内部类、匿名内部类。
2、内部类编译结束后的class文件,以“外部类$内部类内部类.class”的形式出现。
3、内部类对象会保留一个外部对象的引用,即:Out.this。
二、非静态成员内部类。
1、非静态成员内部类:不带有关键字static,相当于外部类的内部属性以及方法的集合。
代码形式:
public class 外部类{
class 内部类{//非静态内部类
}
}
2、实例化方式:
public class 外部类 {
class 内部类{
public void display(){
System.out.println("这是内部类。。");
}
}
public static void main(String args[]){
//1、非静态成员内部类的实例化方式
外部类 Outer = new 外部类();
内部类 Inner = Outer.new 内部类();//等同于:new 外部类().new 内部类();
Inner.display();
}
}
3、常见用法及其注意事项:
非静态内部类相当于外部类的非静态成员属性以及方法,含有外部对象的引用。
访问自己内部的成员属性。可以直接访问,也可以通过【内部类.this】或者【this】来代表内部类。
【外部类.this】可以代表外部类对象的引用。
public class 外部类 {
private String name="外部类";//外部类name声明并实例化
class 内部类{
private String name="内部类";//内部类name声明并实例化
public void display(){
//直接访问内部类内部成员变量
System.out.println("内部类描述1:"+name);
//内部类.this或者this.name代表内部类自身
System.out.println("内部类描述2:"+内部类.this.name);
//外部类.this代表外部类的引用
System.out.println("外部类描述:"+外部类.this.name);
}
}
public static void main(String args[]){
//1、非静态成员内部类的实例化方式
外部类 Outer = new 外部类();
内部类 Inner = Outer.new 内部类();
Inner.display();
}
}
输出:
内部类描述1:内部类
内部类描述2:内部类
外部类描述:外部类
c、外部类方法引用内部类对象以及方法
public class 外部类 {
private String name="外部类";//外部类name声明并实例化
public void display(){
System.out.println("外部类描述:"+name);
//
内部类 inner = new 内部类();
inner.display();
System.out.println("内部类成员属性:"+inner.name);
}
class 内部类{
private String name="内部类";//内部类name声明并实例化
public void display(){
//直接访问内部类内部成员变量
System.out.println("内部类描述1:"+name);
//内部类.this或者this.name代表内部类自身
System.out.println("内部类描述2:"+内部类.this.name);
//外部类.this代表外部类的引用
System.out.println("外部类描述:"+外部类.this.name);
}
}
}
三、局部内部类
1、代码形式:
public class 外部类 {
public void demoPartialClass(){
class 局部内部类{
}
}
}
2、局部内部类的实例化:
public class 外部类 {
public void demoPartialClass(final String name){
class 局部内部类{
}
//1、局部内部类的实例化
局部内部类 partialInnerClass = new 局部内部类();
}
}
3、常见用法及注意事项
局部内部类中访问外部局部变量,变量必须是final的。
public void demoPartialClass(final String name){//必须是final修饰的
final String discription = "这里演示局部内部类";
class 局部内部类{
public void display(){
System.out.println("局部内部类描述:"+name);
}
public void work(){
System.out.println("局部内部类工作:"+discription);
}
}
}
四、静态内部类
静态内部类相当于外部定义的类,类名前可以使用public、protected以及private等修饰。
1、代码形式:
public class 外部类 {
/*public*/ static class 静态内部类{
}
}
2、静态内部类的实例化
public class 外部类 {
/*public*/ static class 静态内部类{
}
}
静态内部类 static_ = new 静态内部类();
3、常见用法及注意事项
可以访问局部内部类中的非静态方法和属性,不能访问外部类的非静态成员方法和属性。
public class 外部类 {
/*public*/ static class 静态内部类{
private static String name="静态内部类";
public void display() {
System.out.println("静态内部类描述:" + name);
//2、无法调用外部类的非静态属性、方法
// System.out.println("外部类的非静态属性:"+外部类.this.name);//报错
// System.out.println("外部类的非静态方法:"+外部类.this.display());//报错
}
}
}
五、匿名内部类
1、代码形式:
new 接口/类{
//add unimplemented methods
};
ps:不要忘记大括号最好的分号。
二、实例化:
匿名内部类只能实例化一个对象
public class 外部类 {
public void demoAnnonymos() {
new Object(){
public String toString() {
return super.toString();
}
};
}
}
代码下载:http://download.csdn.net/detail/hailushijie/9688012