Java内部类之成员内部类(附详细代码示例)
纯手工原创!!! 大神们多多指导,欢迎评论!
如需转载,请注明出处:https://www.cnblogs.com/wild-coder/articles/11680333.html
/**
* 总结:(此处讨论的是非静态成员内部类,以下简称成员内部类)
* 1、成员内部类是一个类,具有类的特征;成员内部类是和构造器、属性、方法、代码块相似的类成员;
* 2、成员内部类除了public外,可以比外部类多三种修饰符:protected、private、static、"默认不写"(这四种其实就是修饰成员的修饰符)、在其他类和包中遵循这几种修饰符的访问权限原则;
* 3、成员内部类访问外部类:可以直接访问外部类的任何成员;
* 4、成员内部类被外部类访问原则:外部类方法不可以直接访问内部类属性和方法,需要使用内部类生成的对象:InnerClass innerClass = new InnerClass(); 使用innerClass访问内部类方法和属性 (因为外部类对象生成时不会同时生成内部类对象,需要另外单独定义和new才行,参考8、9条);
* 5、成员内部类依赖于外部类的对象而存在,所以不能定义static修饰的属性、方法、代码块,外部类的static方法和代码块也不能和非静态成员内部类有关系(因为一个是类级别,一个是实例成员级别);
* 6、成员内部类如果有和外部类同名属性冲突,内部访问外部属性使用:OuterClass.this.commonField(外部类名.this.外部属性名)
* 7、成员内部类对象依赖于外部类对象而存在(是外部类对象的一个成员),必须先生成外部类对象:
* 8、成员内部类对象寄生在外部类对象中,“有内必有外,有外不一定有内”,外部类对象定义后才能定义内部类对象:
* 9、当定义一个成员内部类对象的时候,内部类对象保存着一个外部类对象的引用。
* 生成成员内部类对象的方法:
* OuterClass out = new OuterClass();
* InnerClassA inner = out.new InnerClassA();
* 或者:OuterClass.InnerClassA inner1 = out.new InnerClassA();
*/
写一个包含内部类的外部类:
public class OuterClass { // 外部类
public static int outStaticField = 10;
public int outPublicField = 1;
protected int outProtectedField = 2;
int outDedaultField = 3;
private int outPrivateField = 4;
public String commonField = "我是外部类的commonField";
// 外部类普通实例方法
public void outMethod() {
System.out.println("in outMethod");
/**---start------如下代码会报错,外部类不能直接访问内部类的细节,需要定义内部类的对象才行:
System.out.println(innnerPublicField);
innerMethod1();
*///---end------代码会报错,外部类不能直接访问内部类的细节,需要定义内部类的对象才行:
//外部实例方法中可以直接实例化成员内部类并且访问所有的属性:
InnerClassA innerClass = new InnerClassA();
System.out.println("外部类中通过内部类对象访问内部类public成员:" + innerClass.innnerPublicField);
System.out.println("外部类中通过内部类对象访问内部类protected成员:" + innerClass.innnerProtectedField);
System.out.println("外部类中通过内部类对象访问内部类默认不写成员:" + innerClass.innnerDedaultField);
System.out.println("外部类中通过内部类对象访问内部类private成员:" + innerClass.innnerPrivateField);
//外部实例方法中使用内部类的对象调用内部类实例方法:
innerClass.innerMethod();
innerClass.innerMethod1();
}
/**
* 外部类静态方法
* 不能调用
*/
public static void outStaticMethod() {
System.out.println("in outStaticMethod");
}
// 定义内部类
public class InnerClassA {
public int innnerPublicField = 1;
protected int innnerProtectedField = 2;
int innnerDedaultField = 4;
private int innnerPrivateField = 4;
public String commonField = "我是内部类的commonField";
// public static int innerStaticField = 5; //不能定义static属性
/**
* 内部类普通成员方法(不能定义static方法)
* 1、可以直接访问外部类所有实例属性
* 2、可以直接调用外部类所有实例方法
* 3、可以直接访问外部类所有静态属性
* 4、可以直接调用外部类所有静态方法
*/
public void innerMethod() {
System.out.println("in innerMethod");
System.out.println("在内部类中访问外部类public成员:" + outPublicField); //访问外部类实例属性
System.out.println("在内部类中访问外部类protected成员:"+ outProtectedField);
System.out.println("在内部类中访问外部类默认不写的成员:"+ outDedaultField);
System.out.println("在内部类中访问外部类private成员:" + outPrivateField);
System.out.println("在内部类中访问外部类static属性:" + outStaticField); //访问外部类静态变量
System.out.println("在内部类中访问-和-外部类同名的属性:" + this.commonField); //此处this可以省略
System.out.println("在内部类中访问外部类的同名属性:" + OuterClass.this.commonField);
System.out.print("即将调用外部static方法:");
outStaticMethod(); //可以访问外部类静态方法
// outMethod(); //可以访问外部类实例方法,因为会递归调用所以暂时注释
}
/**
* 可以被外部类非static方法直接调用
*/
public void innerMethod1() {
System.out.println("in private innerMethod1");
}
//成员内部类不可以定义static方法:以下代码会报错
//public static void innerStaticMethod() {}
}
}
写一段测试代码Test.java:
public class Test {
public static void main(String[] args) {
OuterClass out = new OuterClass();
out.outMethod();
// 如果InnerClassA是private修饰的,则此处不可访问:
InnerClassA inner = out.new InnerClassA();
inner.innerMethod1();
}
}
输出结果:

欢迎各路大神多多指点。

浙公网安备 33010602011771号