Java中外部类的子类会继承外部类的成员内部类,成员内部类的简单说明

package com.it.study;

public class TestMemberInnerClass {
	public static void main(String[] args) {
		Outer.UnstaticInnerClass varName = new Outer().new UnstaticInnerClass();
		varName.show();
		Outer out = new Outer();
		Outer.UnstaticInnerClass unsi = out.new UnstaticInnerClass();
		unsi.show();
		
		Outer.StaticInnerClass varName2 = new Outer.StaticInnerClass();
		System.out.println(varName2.age);
		System.out.println(varName2.staticPropIner);
		System.out.println(Outer.StaticInnerClass.staticPropIner);
		varName2.show();
//		Outer.StaticInnerClass si = new Outer().new Outer.StaticInnerClass();//当被封闭实例限定时,无法使用其复合名称分配成员类型Outer.StaticInnerClass。成员类型名称相对于限定实例类型进行解析
		
		
		OuterChild otc = new OuterChild();
		OuterChild.UnstaticInnerClass unsi2 = otc.new UnstaticInnerClass();
		OuterChild.StaticInnerClass varName3 = new OuterChild.StaticInnerClass();
	}
}
class OuterChild extends Outer{
}

class Outer{
	private int age = 10;
	private int outerProp = 10;
	public static int staticProp = 10;
	public void OuterSelfMethod() {
		System.out.println(this.new UnstaticInnerClass().age);
	}
	public static void OuterStaticSelfMethod() {
		System.out.println(Outer.StaticInnerClass.staticPropIner);
	}
	class UnstaticInnerClass{
		int age = 20;
		public void show() {
			int age = 30;
			System.out.println("内部类方法里的局部变量age:" + age);// 30
            System.out.println("内部类的成员变量age:" + this.age);// 20
            System.out.println("外部类的成员变量age:" + Outer.this.age);// 10
            System.out.println("外部类的成员变量outerProp:" + outerProp);
            new Outer().OuterSelfMethod();
		}
	}
	static class StaticInnerClass{
		int age = 10;
		static int staticPropIner = 10;
		public void show() {
			int age = 30;
			System.out.println("内部类方法里的局部变量age:" + age);// 30
            System.out.println("内部类的成员变量age:" + this.age);// 20
//            System.out.println("外部类的成员变量age:" + Outer.this.age);// 10
//            System.out.println("外部类的成员变量outerProp:" + outerProp);
            System.out.println("外部类的成员变量staticProp:" + Outer.staticProp);// 10
            System.out.println("外部类的成员变量staticProp:" + staticProp);
//            OuterSelfMethod();
            Outer.OuterStaticSelfMethod();
		}
	}
}

可以用private、default、protected、public进行修饰(就和普通成员一样),类文件:外部类$内部类.class
1、 非静态内部类(外部类里使用非静态内部类和平时使用其他类一样)
a) 非静态内部类必须寄存在一个外部类对象里。故而非静态内部类对象一定有个外部类对象存在。非静态内部类对象单独属于某个外部类对象(封装,类似某人自己的心脏)
b) 非静态内部类可以直接访问外部类成员,但外部类成员不可以访问非静态内部类成员。
c) 非静态内部类不可以有静态方法、静态属性和静态初始化块。(因为是类的非静态成员)
d) 外部类的静态方法,静态代码块,不可以访问静非态内部类,包括不可以用它定义变量和创建实例。
e) 成员变量的访问:
i. 内部类方法的局部变量:变量名
ii. 内部类属性:this.变量名。
iii. 外部类属性:外部类名.this.变量名(如果这个属性只有外部类有,也可以直接用)
f) 内部类的访问:
i. 外部类中定义内部类:new Inner();
ii. 外部类以外的地方使用非静态内部类:Outer.Inner varnme = new Outer().newInner();
2、 静态内部类
a) 定义方式:
static class ClassName{//类体}
b) 使用要点:
i. 当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。(静态内部类是类的静态成员)
ii. 静态内部类看作外部类的一个静态成员。因此外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过new 静态内部类()访问静态内部类的实例。

发布了37 篇原创文章 · 获赞 29 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42755868/article/details/104876605