参考博客:
- Java-为什么非静态内部类里面不能定义静态方法、静态成员变量、静态初始化块?:https://blog.csdn.net/hello123yy/article/details/81129903?utm_source=blogxgwz0
- 静态内部类:https://www.cnblogs.com/Dean-0/p/11198112.html
内部类测试类,如下:
package com.ming.interview.inner;
import com.ming.interview.inner.Outer.Inner;
/**
* @ClassName: Outer
* @Description: TODO(外部类和内部类、静态内部类)
* @author lenovo
* @date 2020年6月15日
*
*/
/*
* 总结:
* 1.内部类不能有静态成员变量、静态方法、静态代码块等,通过查看jvm类加载的过程不难理解这个问题:
* 在类加载的时候,静态属性和代码块会先加载,那么按照这个逻辑,非静态内部类里面的静态属性也要优先于这个内部类加载,但这个时候这个内部类都还没有初始化,这就出现矛盾了。
* 2.【外部类属性、方法访问修饰符】和【内部类类、属性、方法访问修饰符】只针对外部类之外的其他类,在当前外部类和内部类不起作用【外部类和内部类看成一个整体,内部类属于外部类的一部分,相互没有访问限制的】
* 3.静态类内部不可以访问外部类的实例成员,只能访问外部类的类成员
*/
public class Outer {
private String name;
/*
* 外部类私有方法
*/
private static void get() {
System.out.println("外部类私有方法");
}
/*
* 外部类私有静态方法
*/
private static void getStatic() {
System.out.println("外部类私有静态方法");
}
/*
* 外部类调用内部类私有方法
*/
public void processInnerGet() {
new Inner().get();
}
/*
* 内部类
*/
class Inner {
/*
* 内部类私有方法
*/
private void get() {
System.out.println("内部类私有方法" + name);
}
/*
* 内部类调用外部类私有方法
*/
private void processOuterGet() {
new Outer().get();
}
/*
* 内部类调用外部类私有静态方法
*/
private void processOuterGetStatic() {
Outer.getStatic();
}
}
/*
* 外部类调用静态内部类静态方法
*/
public static void processInnerStaticGetStatic() {
InnerStatic.getStatic();
}
/*
* 外部类调用静态内部类非静态方法
*/
public static void processInnerStaticGet() {
new InnerStatic().get();
}
/*
* 静态内部类
*/
static class InnerStatic {
/*
* 私有静态方法
*/
private static void getStatic() {
System.out.println("静态内部类私有静态方法");
//静态类内部不可以访问外部类的实例成员,只能访问外部类的类成员
System.out.println("静态内部类私有静态方法" + name);
}
/*
* 静态方法
*/
private void get() {
System.out.println("静态内部类私有非静态方法");
//静态类内部不可以访问外部类的实例成员,只能访问外部类的类成员
System.out.println("静态内部类私有静态方法" + name);
}
}
/*
* 私有内部类
*/
private class InnerProtecet {
}
}
class Outer1 {
public void test() {
Outer outer = new Outer();
//创建内部类对象方式一
Outer.Inner inner1 = outer.new Inner();
//创建内部类对象方式二
Outer.Inner inner2 = new Outer().new Inner();
//创建私有内部类对象:其他类无法创建私有内部类对象
outer.new InnerProtecet();
//内部类的私有方法get()只能在内部类或其对应的外部类中访问
inner1.get();
//静态内部类的私有静态方法getStatic()只能在内部类或其对应的外部类中访问
Outer.InnerStatic.getStatic();
}
}