静态内部类的使用方式和成员内部类相似,只不过多了个 static 修饰符



文章目录


1. 静态内部类的使用

  • 说明:静态内部类是定义在外部类的成员位置,并且有​​static​​修饰
  1. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
public class StaticInnerClass01 {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();

}
}

class Outer10 { //外部类
private int n1 = 10;
private static String name = "兮动人";
//Inner10就是静态内部类
//1. 放在外部类的成员位置
//2. 使用static 修饰
//3. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
//4. 可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员
//5. 作用域 :同其他的成员,为整个类体
static class Inner10 {
public void say() {
System.out.println(name);
}
}

public void m1() { //外部类---访问------>静态内部类 访问方式:创建对象,再访问
Inner10 inner10 = new Inner10();
inner10.say();
}


}

【JavaSE】静态内部类_静态内部类

  1. 可以添加任意访问修饰符​​(public、protected、默认、private​​),因为它的地位就是一个成员。
    【JavaSE】静态内部类_内部类_02

  2. 作用域:同其他的成员,为整个类体。

  3. 静态内部类——>访问——>外部类(比如:静态属性或方法)【访问方式:直接访问所有静态成员】
    【JavaSE】静态内部类_java静态内部类_03

  4. 外部类-——>访问——>静态内部类,【访问方式:创建对象,再访问】
    【JavaSE】静态内部类_外部类_04

  5. 外部其他类——>访问——>静态内部类,3种访问方式

  • 方式1:
public class StaticInnerClass01 {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();

//外部其他类 使用静态内部类
//方式1:
//因为静态内部类,是可以通过类名直接访问(前提是满足访问权限)
Outer10.Inner10 inner10 = new Outer10.Inner10();
inner10.say();
}
}

class Outer10 { //外部类
private int n1 = 10;
private static String name = "兮动人";
//Inner10就是静态内部类
//1. 放在外部类的成员位置
//2. 使用static 修饰
//3. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
//4. 可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员
//5. 作用域 :同其他的成员,为整个类体
static class Inner10 {
public void say() {
//如果外部类和静态内部类的成员重名时,静态内部类访问的时,
//默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.成员)
System.out.println(name);
}
}

public void m1() { //外部类---访问------>静态内部类 访问方式:创建对象,再访问
Inner10 inner10 = new Inner10();
inner10.say();
}

【JavaSE】静态内部类_java静态内部类_05

【JavaSE】静态内部类_java静态内部类_06

  • 方式2:
public class StaticInnerClass01 {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();

//外部其他类 使用静态内部类
//方式1:
//因为静态内部类,是可以通过类名直接访问(前提是满足访问权限)
Outer10.Inner10 inner10 = new Outer10.Inner10();
inner10.say();

//方式2
//编写一个方法,可以返回静态内部类的对象实例.
Outer10.Inner10 inner101 = outer10.getInner10();
System.out.println("============");
inner101.say();

}
}

class Outer10 { //外部类
private int n1 = 10;
private static String name = "兮动人";
//Inner10就是静态内部类
//1. 放在外部类的成员位置
//2. 使用static 修饰
//3. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
//4. 可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员
//5. 作用域 :同其他的成员,为整个类体
static class Inner10 {
public void say() {
//如果外部类和静态内部类的成员重名时,静态内部类访问的时,
//默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.成员)
System.out.println(name);
}
}

public void m1() { //外部类---访问------>静态内部类 访问方式:创建对象,再访问
Inner10 inner10 = new Inner10();
inner10.say();
}

public Inner10 getInner10() {
return new Inner10();
}

}

【JavaSE】静态内部类_java静态内部类_07

【JavaSE】静态内部类_外部类_08

【JavaSE】静态内部类_内部类_09

  • 方式3:也可以写成静态的返回
public class StaticInnerClass01 {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();

//外部其他类 使用静态内部类
//方式1:
//因为静态内部类,是可以通过类名直接访问(前提是满足访问权限)
Outer10.Inner10 inner10 = new Outer10.Inner10();
inner10.say();

//方式2
//编写一个方法,可以返回静态内部类的对象实例.
Outer10.Inner10 inner101 = outer10.getInner10();
System.out.println("============");
inner101.say();

//方式3:
Outer10.Inner10 inner10_ = Outer10.getInner10_();
System.out.println("************");
inner10_.say();

}
}

class Outer10 { //外部类
private int n1 = 10;
private static String name = "兮动人";
//Inner10就是静态内部类
//1. 放在外部类的成员位置
//2. 使用static 修饰
//3. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
//4. 可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员
//5. 作用域 :同其他的成员,为整个类体
static class Inner10 {
public void say() {
//如果外部类和静态内部类的成员重名时,静态内部类访问的时,
//默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.成员)
System.out.println(name);
}
}

public void m1() { //外部类---访问------>静态内部类 访问方式:创建对象,再访问
Inner10 inner10 = new Inner10();
inner10.say();
}

public Inner10 getInner10() {
return new Inner10();
}

public static Inner10 getInner10_() {
return new Inner10();
}
}

【JavaSE】静态内部类_内部类_10

【JavaSE】静态内部类_外部类_11

【JavaSE】静态内部类_外部类_12

  1. 如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近原则,如果想访问外部类的成员,则可以使用【​​外部类名.成员​​】去访问
public class StaticInnerClass01 {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();

//外部其他类 使用静态内部类
//方式1:
//因为静态内部类,是可以通过类名直接访问(前提是满足访问权限)
Outer10.Inner10 inner10 = new Outer10.Inner10();
inner10.say();

//方式2
//编写一个方法,可以返回静态内部类的对象实例.
Outer10.Inner10 inner101 = outer10.getInner10();
System.out.println("============");
inner101.say();

//方式3:
Outer10.Inner10 inner10_ = Outer10.getInner10_();
System.out.println("************");
inner10_.say();

}
}

class Outer10 { //外部类
private int n1 = 10;
private static String name = "兮动人";
//Inner10就是静态内部类
//1. 放在外部类的成员位置
//2. 使用static 修饰
//3. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
//4. 可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员
//5. 作用域 :同其他的成员,为整个类体
static class Inner10 {
private static String name = "xdr";
public void say() {
//如果外部类和静态内部类的成员重名时,静态内部类访问的时,
//默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.成员)
System.out.println(name + " 外部类name= " + Outer10.name);
}
}

public void m1() { //外部类---访问------>静态内部类 访问方式:创建对象,再访问
Inner10 inner10 = new Inner10();
inner10.say();
}

public Inner10 getInner10() {
return new Inner10();
}

public static Inner10 getInner10_() {
return new Inner10();
}
}

【JavaSE】静态内部类_静态内部类_13

【JavaSE】静态内部类_java静态内部类_14

2. 测试题

  • 写出输出的结果是多少
    【JavaSE】静态内部类_java静态内部类_15
  • 由分析可以得出,最后输出两个 5
    【JavaSE】静态内部类_静态内部类_16
    【JavaSE】静态内部类_外部类_17
public class InnerClassExercise {
public static void main(String[] args) {

}
}

class Test {//外部类

public Test() {//构造器
Inner s1 = new Inner();
s1.a = 10;
Inner s2 = new Inner();
System.out.println(s2.a);
}

class Inner { //内部类,成员内部类
public int a = 5;
}

public static void main(String[] args) {
Test t = new Test();
Inner r = t.new Inner();//5
System.out.println(r.a);//5
}
}

【JavaSE】静态内部类_静态内部类_18

3. 内部类小节

(1) 内部类有四种:​局部内部类,匿名内部类,成员内部类,静态内部类

(2) 重点还是掌握匿名内部类使用

new /接口(参数列表){
//...
};

(3) 成员内部类、静态内部类是放在外部类的成员位置上的,本质就是一个成员。