内部类(Inner Class)
内部类共有四种:
- 静态内部类(Static Inner Class):只能访问外部类的静态成员变量与静态方法,声明方式如下:
静态内部类的访问方式如下:public class OuterTest { private static String str; /** * 静态内部类 * @author asus * */ public static class InnerClass { public void get() { str = "Hello World"; System.out.println(str); } } }
OuterClass.InnerClass innerClass = new OuterClass.InnerClass(); innerClass.get();
- 成员内部类(Member Inner Class):可以访问外部类的静态与非静态方法与成员变量。
生成成员内部类的方式如下:public class OuterClass { private static String str; /** * 成员内部类 * @author asus * */ public class InnerClass { public void get() { str = "Hello World"; System.out.println(str); } } }
OuterClass.InnerClass innerClass = new OuterClass().new InnerClass(); innerClass.get();
public class OuterClass { private String str = "Hello World"; /** * 成员内部类 * @author asus * */ public class InnerClass { private String str = "Inner Class"; public void get() { System.out.println(OuterClass.this.str); } } }
如果内部类与外部类的属性名称相同,内部类想访问外部类的属性需采用如下方式:public class OuterClass { private String str = "Hello World"; /** * 成员内部类 * @author asus * */ public class InnerClass { private String str = "Inner Class"; public void get() { System.out.println(OuterClass.this.str); } } public static void main(String[] args) { OuterClass.InnerClass innerClass = new OuterClass().new InnerClass(); innerClass.get(); } }
- 局部内部类(Local Inner Class):定义在方法当中,只能访问方法中声明的final类型的变量。
public class OuterClass { private String str = "Hello World"; public void get() { final int num = 123; class InnerClass { public void get() { System.out.println(str + num); } } new InnerClass().get(); } public static void main(String[] args) { OuterClass outerClass = new OuterClass(); outerClass.get(); } }
- 匿名内部类(Anonymous Inner Class):匿名内部类会隐式地继承一个父类或实现一个接口。
如果该匿名类未重写Date类的toString()方法将输出:Hello Tue Mar 04 22:06:43 CST 2014import java.util.Date; public class OuterClass { public static String say(Date date) { return "Hello " + date; } public static void main(String[] args) { /* * 定义了一个内部类,该内部类隐式地继承了Date类 * 并在say方法调用时,创建了一个继承自Date类的一个子类对象 * 并将该子类对象的引用传递给say方法 */ String str = OuterClass.say(new Date() { }); System.out.println(str); } }
- 静态内部类(Static Inner Class):只能访问外部类的静态成员变量与静态方法,声明方式如下:
如果重写了toString()方法:
import java.util.Date;
public class OuterClass {
public static String say(Date date)
{
return "Hello " + date;
}
public static void main(String[] args) {
/*
* 定义了一个内部类,该内部类隐式地继承了Date类
* 并在say方法调用时,创建了一个继承自Date类的一个子类对象
* 并将该子类对象的引用传递给say方法
*/
String str = OuterClass.say(new Date()
{
@Override
public String toString() {
return "World";
}
});
System.out.println(str);
}
}
结果将为:Hello World
当打印引用时,实际上会打印引用所指对象的
toString()方法的返回值
,因为每个类都直接或间接地继承自Object,而
toString()方法是Object类里的一个实例方法
,
因此所有java对象都具有toString方法。
toString方法是一个”自我描述“方法,该方法总是返回该对象实现类的类名
+@+hashCode
值。