packagecy.内部类.静态内部类;public classStaticOuter {private static String name = "Outer";private int age = 10;public static classStaticInner {
@SuppressWarnings("unused")private static String name = "Inner";public voidsayOuterName() {
System.out.println("inner:" +StaticOuter.name);
}/** 错误,静态内部类不能访问外部类的非静态成员。
public void sayOuterAge() {
System.out.println(age);
}*/}public voidsayName() {
System.out.println(name);
}public voidsayAge() {
System.out.println(age);
}
}
packagecy.内部类.静态内部类;public classTestMain {public static voidmain(String[] args) {
StaticOuter staticOuter= newStaticOuter();
staticOuter.sayAge();
staticOuter.sayName();
StaticOuter.StaticInner staticInner= newStaticOuter.StaticInner();
staticInner.sayOuterName();
}
}
运行结果:
10
Outer
inner:Outer
由此可以看出,静态内部类的对象处了没有对外围类对象的应用特权外,与其他所有内部类完全一样。
成员内部类member inner class
packagecy.内部类.成员内部类;public classOuter {private static String name = "Outer";private int age = 10;public classInner {private final static String name = "Inner";private int age = 11;public voidsayOuterName() {//内部类中引用外部类对象的静态成员
System.out.println("inner:" +Outer.name);
}public voidsayInnerName() {
System.out.println("inner:" +Inner.name);
}public voidsayInnerAge() {
System.out.println("inner:" + this.age);
}public voidsayOuterAge() {//内部类中引用外部类对象的非静态成员
System.out.println(Outer.this.age);
}publicOuter createOuter() {//内部类中创建外部类。
return newOuter();
}
}public voidsayName() {
System.out.println(name);
}public voidsayAge() {
System.out.println(age);
}publicInner createInner() {//外部类中创建内部类对象。
return this.newInner();
}
}
public classTestMain {public static voidmain(String[] args) {
Outer outer= newOuter();
outer.sayAge();
outer.sayName();//区别于静态内部类的创建方法
Inner inner = outer.newInner();
inner.sayOuterName();
}
}
运行结果:
10
Outer
inner:Outer
局部内部类local inner class
局部类不能用public,protected或者private访问说明符进行声明。它的作用域是被限定在这个局部类的块中。
局部类有一个优势,即对外世界可以完全隐藏起来,其他类中的代码不能访问它。
packagecy.内部类.局部内部类;public classOuter {private static String name = "Outer";private int age = 10;public voiddoSomeThing() {//局部内部类,局部内部类,不允许带有 public,protected,private//public class Inner {//protected class Inner {//private class Inner {
classInner {//private static String name;//private final static String name;
public voidsayInnerName() {
System.out.println(name);
}public voidsayOuterName() {
System.out.println(Outer.name);
}
}
Inner inner= newInner();
inner.sayInnerName();
inner.sayOuterName();
}public voiddoSomeThingA() {if (this.age > 0) {//这个Inner与上一个Inner没有任何关系
classInner {public voidsayInnerName() {
System.out.println(name);
}public voidsayOuterName() {
System.out.println(Outer.name);
}
}
Inner inner= newInner();
inner.sayInnerName();
inner.sayOuterName();
}
}public voidsayName() {
System.out.println(name);
}public voidsayAge() {
System.out.println(age);
}
}
匿名内部类anonymous inner class
假设这创建某个类的一个对象,就不必命名了,这种类成为“匿名内部类”。
packagecy.内部类.匿名内部类;public classOuter {public static voidmain(String[] args) {//内部类引用外部类对象,使用final。
final String name = "name";//接口直接创建对象。类名称并没有直接定义。Java编译器会自动给一个类名称。//注意匿名内部类的重要使用场景。“线程”
Say s = newSay() {
@Overridepublic voidsay() {
System.out.println("hello world " +name);
}
};
s.say();
}
}interfaceSay {voidsay();
}
这种语法有点难理解,它的含义是:创建一个实现Say接口的类的新对象,需要实现的方法say定义在{}中。
由于构造器的名字必须跟类名相同,而匿名类没有名称,所以匿名类不能有构造器。取而代之的是,构造器参数传递给超类(superclass)构造器。尤其是在内部类实现接口的时候,不能有任何构造参数。