外部类能访问内部类的成员(2)
Outter outter = new Outter();
ForInner forInner = outter.getInner();
forInner.sayHello();
}
}
class Outter {
ForInner forInner;
public ForInner getInner() {
class Inner implements ForInner {
public void sayHello() {
System.out.println("你好,我是局部内部类对象,我还存在!");
}
}
forInner = new Inner();
return forInner;
}
}
interface ForInner {
void sayHello();
}
由于局部内部类只在局部有效,所以不能在外面用局部内部类的引用指向局部内部类的对象,只能用局部内部类实现接口并创建局部内部类对象,在外面用接口引用指向局部内部类对象。
静态方法中的局部内部类只能访问外围类的静态成员,访问不了非静态成员。
局部内部类生成的.class文件名称是<外部类类名>$<n><内部类类名>其中n是该局部的第几个内部类
静态内部类
静态内部类的定义
class Outter {
static class Inner {
/****/
}
}
由于静态内部类是外部类的静态成员,所以静态内部类只能访问外部类的静态成员。并且创建静态内部类的对象不依赖外部类的对象。在外部类之外创建静态内部类对象的语法如下
<外部类类名>.<内部类类名> 引用变量名 = new <外部类类名>.<内部类构造器>;
例子:
class Outter {
static class Inner {
public void sayHello() {
System.out.println(“成功创建静态内部类对象!”);
}
}
public void getInner() {
//在外部类中创建静态内部类的对象
Inner ii = new Inner();
ii.sayHello();
}
}
public class MainTest {
public static void main(String[] args) {
//在外部类外创建静态内部类的对象
Outter.Inner i = new Outter.Inner();
i.sayHello();
//在外部类中使用静态内部类的对象
new Outter().getInner();
}
}
静态内部类实际上已经脱离了外部类的控制,创建对象时也不再需要外部类对象的存在,实质上只是一个放置在别的类中的普通类而已。
匿名内部类
基于继承的匿名内部类,语法如下:
new <匿名内部类要继承父类的对应构造器> {
//匿名内部类类体
};
基于实现接口的匿名内部类,语法如下:
new <接口名> {
//匿名内部类类体,实现接口中的所有方法
}
匿名内部类中使用外面的变量要被声明成final的。
匿名内部类对象初始化的代码可以写在其非静态块中
匿名内部类生成的.class文件是<外部类类名>$<n>.class n是该类的第几个匿名内部类。
各种内部类可用的修饰符
成员内部类
final、abstract、public、private、protected、static
静态内部类
final、abstract、public、private、protected
局部内部类
final、abstract
匿名内部类
不能对匿名内部类使用修饰符
内部接口
定义在类中的内部接口无论是否被static修饰都是静态成员。
内部接口声明成private的意味着只能被外部类中的某个内部类来实现。
内部接口不能扮演局部的角色,否则编译报错。因为接口的设计初衷是对外公布,让很多类实现,而局部的角色违背了接口的设计初衷。
接口中的内部接口属于接口的成员,具有接口成员的所有属性,不能用private进行修饰。
外部接口外实现内部接口的语法如下:
class <类名> implements <外部接口名>.<内部接口名> {
相关新闻>>
- 发表评论
-
- 最新评论 更多>>