`
sunmiracle
  • 浏览: 14804 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SCJP笔记_章八_内部类

    博客分类:
  • SCJP
阅读更多
第八章 内部类
内部类

常规内部类在另一个类的波形括号内声明,单位与任何方法或其它代码块之外
内部类是封装类(外部类)一个完整的成员,因此,他能够使用访问修饰符标识,也能使用abstract或final修饰符标识,但是不能同时使用。
内部类实例与封装类实例共享一种特殊关系,这种关系使内部类可以访问外部类的所有成员,包括私有成员。
在封装类内部实例化内部类,如下:MyInner mi=new MyInner();
在封装类的实例方法之外实例化内部类,如下:MyOuter mo=new MyOuter();MyOuter.MyInner inner=mo.new MyInner();

在内部类代码中,关键字this表示内部类实例的引用。为了引用外部类,应该使用如下:MyOuter.this;

局部方法内部类

局部方法内部类在封装类的方法内定义。
局部方法内部类的实例化必须发生在同一个方法内,但位于该类的定义代码之后。
class MyOuter{
private String x="outer";
void doStuff(){class MyInner{public void seeOuter()
{System.out.println("outer x is"+x);}}
MyInner mi =new MyInner();
mi.seeOuter();

局部方法内部类不能使用在该方法内声明的变量,除非变量是Final的,但是可以使用封装类的所有成员变量
局部方法内部类的修饰符只有abstract和final。访问修饰符等都不可以用。
在一个静态方法内声明的局部方法内部类只能访问该封装类的静态成员,不能访问实例变量。

匿名内部类


匿名内部类没有名称,它的类型是一个命名类型的子类,或者是接口的实现。
不要忘记匿名内部类波形括号之后的分号。如果是局部方法内部类,则是:});如果只是普通的旧式匿名类,就是};
在匿名内部类引用上能够调用的方法必须是在引用变量类(或者接口),也可以理解为父类中,定义的方法,即使该匿名类确实是引用变量类型的子类或实现。
匿名内部类只可以扩展或者实现一个借口,两者取其一,也不能实现多个接口。这个和别的内部类不同。
变元内声明的匿名内部类
class MywonderfulClass{
void go(){
Bar b=new Bar();
b.doStuff(new Foo(){
public void foof(){do sth}
});
}
}
interface Foo{void foof();}
class Bar{void doStuff(Foo f){}}

静态嵌套类

静态嵌套类是用Static修饰符表示的内部类
静态嵌套类是一个顶级嵌套类。
由于嵌套类是静态的,所以它不与外部类实例共享任何关系。事实上,不需要外部类实例来实例化静态嵌套类。
实例化静态嵌套类需要使用外部类名称和嵌套类名称,如下:
BigOuter.Nested n =new BigOuter.Nested();
静态嵌套类不能访问外部类的非静态成员,因为它没有对外部实例的隐含引用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics