Java的内部类主要分为三种:成员内部类,局部内部类,匿名类
首先是成员内部类
作用相当于一个内的成员一样,可以访问外部类的所有成员和方法,因为是属于外部类的所以自然也可以访问那些是private的成员和方法了,但是内部类对于外部类却是隐藏的,除了可以在外部类中创建内部类,然后通过内部类的对象进行访问。
public class OutClass {
Inner in = new Inner();
public void ouf() {
}
class Inner{
int y = 0 ;
Inner(){ } ;
public void inf() { } ;
}
public Inner doit() {
//y = 5 ;
in.y = 5 ;
return new Inner() ;
}
public static void main(String[] args) {
OutClass out = new OutClass() ;
OutClass.Inner in = out.doit();
OutClass.Inner in2 = out.new Inner();
}
}
这里的对于内部类的构造都是呈现了两种,我个人感觉第二种更加的具有普遍性,“OutClass.Inner in = Object.new Inner()
内部类向上转型为接口,或基类
interface OutInterface{
public void f() ;
}
class OuterClass{
//定义一个实现接口的内部类
private class InnerClass implements OutInterface{
InnerClass(String s){
System.out.println(s);
}
public void f() {
System.out.println("访问内部类中的方法");
}
}
public OutInterface f() {
return new InnerClass("访问内部类的构造方法");
}
}
public class OutClass {
public static void main(String[] args) {
OuterClass out = new OuterClass();
OutInterface o = out.f();
o.f();
}
}
这里将内部类设置为private使得只有OutClass类可以访问InnerClass类,将内部类封装,同时提通了一个f()的接口,使得外部可以使用此接口创建内部类,向上转型为接口。
局部类(定义在方法中的类)
局部类只能访问当前代码块的常量以及类的所有成员,但是外部类不能够访问此内部类。
class OuterClass3{
public OutInterface doit(String x) {
/*
* 定义一个内部类实现外部接口
*/
class InnerClass2 implements OutInterface{
InnerClass2(String s){
s = x ;
System.out.println(s);
}
public void f() {
}
}
/*
* 这里返回内部类的引用是因为,在外部类中是看不到这个定义在方法中的内部类的。
*/
return new InnerClass2("doit");
}
// InnerClass2 a = new InnerClass2();
}
public class OutClass {
public static void main(String[] args) {
OuterClass3 out = new OuterClass3() ;
OutInterface o = out.doit("hello");
}
}
匿名类
class OuterClass3{
public OutInterface doit() {
return new OutInterface() {
public void f() {
System.out.println("匿名类 "+"hello world");
}
};
}
// InnerClass2 a = new InnerClass2();
}
public class OutClass {
public static void main(String[] args) {
OuterClass3 out = new OuterClass3() ;
OutInterface a = out.doit();
a.f();
}
}
基本的格式是
retrun new A(){
…//内部的类体
};
匿名类因为没有名称,只能使用某人的构造方法来构造
最后的分号不是代表类的结束,而是代表了引用表达式的标识
内部类也是可以被继承的
public class OutputInnerClass extends ClassA.ClassB{
public OutputInnerClass( ClassA a ) {
a.super() ;
}
}
}
class A{
class B{
}
}