说明:这是2007年复习SCJP期间的学习笔记(JavaSE 5.0),有部分遗失。现在整理一下发到Blog上,一方面做个备份,另一方面分享出来,希望对需要的人有用。
------------------------
第八章 内部类
1、从外部类代码内部实例化内部类:
class MyOuter{
public void outer(){
MyInner in=new MyInner();//像实例化普通类一样。
in.inner();
}
class MyInner{
Public void iner(){}
}
}
2、从外部类外部实例化内部类:
Public static void main(String[] args){
MyOuter out=new MyOuter(); //先获得外部类实例。
//使用外部类实例创建内部类,注意内部类返回类型为:外部类.内部类
MyOuter.MyInner in=out.new MyInner();
in.inner();
}
也可以这样写:MyOuter.MyInner in=new MyOuter().new MyInner();
//先实例化外部类再实例化内部类。
3、 实例化内部类是唯一一种在实例上调用new构造实例的方法。
4、 内部类代码内引用:
引用自己:this
引用外部类:外部类.this à MyOuter.this
5、 方法中的内部类不能使用方法内的局部变量,除非该变量为final.
内部类可以直接使用外部类的成员属性,即使它声明为private.
方法中的内部类只能声明为abstract或final.
如果内部类是在静态方法内,那么该内部类只能访问外部类的static成员.
6、 指定类类型的匿名内部类:
class A{
public void display(){
System.out.println(“a”);
}
}
class B{
A a=new A(){ //a是一个匿名内部类实例,继承A类并重写了display()方法。
public void display(){
System.out.println(“b”);
}
}; //注意匿名内部类引用结尾
}//上面的代码并未在方法内,相当于声明和初始化。
7、 指定接口类型的匿名内部类:
interface A { abstract public void display(); }
class B{
A a=new A(){ //实现接口A的匿名内部类,必须实现A中所有方法。
public void display(){
System.out.println(“b”);
}
}; //注意
}
匿名内部类只能实现一个命名类或者单个接口。
8、 参数定义的匿名内部类:
interface Foo{
abstract public void myFoo();
}
class Bar{
public void doStuff(Foo f){}
}
class InParamter{
void go(){
Bar b=new Bar();
b.doStuff(new Foo(){ //一个实现了Foo接口的匿名内部类,作为参数。
public void myFoo(){
System.out.println(“in paramter”);
}
}); //注意
}
}
9、 静态嵌套类:
在外部类内部使用:
class MyOuter{
static class MyInner{ void go(){System.out.println(“go”);}}
public static void main(String[] args){
MyInner in=new MyInner(); //像普通类一样实例化。
in.go();
}
}
在外部类外部使用:
class MyOuter{
static class MyInner{ void go(){System.out.println(“go”);}}
}
class Foo{
public static void main(String[] args){
MyOuter.MyInner in=new MyOuter.MyInner(); //静态嵌套类
//注意new时未使用外部实例,外部类后无()。
//与内部类实例化不同,此处不能用外部实例创建对象引用。
in.go();
}
}
10、静态嵌套类不访问外部的非static实例变量和方法,静态嵌套类能声明和定义非static成员。
11、方法内定义的内部类调用时需用匿名子类实例化,并可以像普通内部类一样直接访问外部类成员。
12、可以为内部类创建匿名子类。
public class Foo{
class Bar{
public void myBar(){System.out.println(“my bar”);}
}
public static void main(String[] args){
(new Bar(){}).myBar();
//先创建了一个Bar的匿名子类,但没有重写myBar()方法。然后调用myBar()方法。
}
}
13、常规内部类可以声明为public\final\abstract\private\protected\static\Strictp。
如果内部类声明为abstract则需要实例化该内部类的具体子类。