成员内部类也叫普通内部类、常规内部类。它有如下特点:
- 成员内部类定义在另一个类中,但是定义时不用static修饰。
- 它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的。
- 在外部类里面创建成员内部类的实例:this.new Innerclass();(this可以不要)
- 在外部类之外创建成员内部类的实例:(new Outerclass()).new Innerclass()或者new OuterClass().new InnerClass()
- 在内部类里访问外部类的成员:Outerclass.this.member
- 成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的。
示例代码如下:
package com.qs.innerclass;
import com.qs.innerclass.MemberInner.InnerClass;
// 成员内部类使用测试
class MemberInner {
private int same = 1;
private static int a = 2;
private int b = 3;
public void outer() {
InnerClass innerObj = new InnerClass();
System.out.println(innerObj.same + " ----- 外部类的非静态方法中创建成员内部类的实例(此时已经有了外部类对象,所以不需要创建)");
System.out.println("outter");
}
public static void outerStatic() {
MemberInner memberInner = new MemberInner();
InnerClass innerObj = memberInner.new InnerClass();
System.out.println(innerObj.same + " ----- 外部类的静态方法中创建成员内部类的实例(此时不一定有外部类的对象,所以得创建)");
System.out.println("outerStatic");
}
// 在外部类里面创建内部类的实例
InnerClass innerObj1 = new InnerClass();
InnerClass innerObj2 = this.new InnerClass();
// 定义一个成员内部类
// 成员内部类可以声明为private、protected、public或者默认访问权限,这个访问权限约定和外部类完全一样。
protected class InnerClass {
private int same = 11;
// 成员内部类不能含有static的变量和方法
// 因为成员内部类需要先创建了外部类,才能创建它自己的。
// private static String address = "BeiJing";
// private static void staticMethod () {
//
// }
private static final String nickName = "dog";
public void test() {
int same = 9;
// 局部的same
System.out.println(same + " ----- 成员内部类中的局部变量(和成员内部类的成员变量以及外部类的成员变量重名)");
// 内部类的same
System.out.println(this.same + " ----- 成员内部类的成员变量(和成员内部类的局部变量以及外部类的成员变量重名)");
System.out.println(nickName);
// 访问外部类里的same
System.out.println(MemberInner.this.same + " ----- 外部类的成员变量(和成员内部类的局部变量以及成员内部类的成员变量重名)");
// 直接访问外部类成员变量(用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用。
// 于是,可以通过这个引用来访问外围类的成员。正是因为如此,我们创建内部类对象时,必须与外部类对象相关联。 )
System.out.println(a + " ----- 成员内部类访问外部类的静态成员变量");
System.out.println(b + " ----- 成员内部类访问外部类的普通成员变量");
// 直接访问外部类的方法(不管是静态的还是非静态的)
outer();
outerStatic();
}
}
}
public class MemberInnerClassTest {
public static void main(String[] args) {
// 创建成员内部类的对象
// 需要先创建外部类的实例
InnerClass inner = new MemberInner().new InnerClass();
inner.test();
}
}