目录
一、定义
二、使用
package com.hspedu.innerclass;
public class StaticInnerClass01 {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();
//外部其他类 使用静态内部类
//1.因为静态内部类, 是可以通过类名直接访问(前提是满足访问权限)
//创建一个类的新对象的格式是 类名 对象名 = new 类名(),这里的类名是Outer10.Inner10
//因为静态内部类,可以通过 直接通过类名来调用
Outer10.Inner10 inner10 = new Outer10.Inner10();
inner10.say();
System.out.println("inner10的运行类型"+ inner10.getClass());
//方式 2
//编写一个方法,可以返回静态内部类的对象实例.
Outer10.Inner10 inner101 = new Outer10().getInner10();
System.out.println("==========");
inner101.say();
System.out.println("==========");
Outer10.getInner10_().say();
}
}
class Outer10 { //外部类
private int n1 = 10;
private static String name = "张三";
private static void cry(){}
//1.放在外部类的成员位置
//2.使用static修饰
//3. 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
//4. 可以添加任意访问修饰符(public、 protected 、 默认、 private),因为它的地位就是一个成员
//5. 作用域 : 同其他的成员, 为整个类体(即Outer10)
static class Inner10 {//静态内部类
private static String name = "李四";
public void say(){
//如果外部类和静态内部类的成员重名时, 静态内部类访问的时,
//默认遵循就近原则, 如果想访问外部类的成员, 则可以使用 (外部类名.成员)
System.out.println("静态内部类的name=" + name + "外部类的name=" + Outer10.name);
cry();
}
public static void say2(){
System.out.println("say2()");
}
}
public void m1(){
Inner10 inner10 = new Inner10();
inner10.say();
}
public Inner10 getInner10(){
return new Inner10();
}
public static Inner10 getInner10_(){
return new Inner10();
}
}
三、练习
package com.hspedu.innerclass;
public class InnerClassExercise01 {
}
class Test_ {//外部类
public Test_ (){//构造器
Inner s1 = new Inner();
s1.a = 10;//对象s1的属性a的值从 5--->10,只是更改了s1这个对象实例的属性,和别的对象没有关系
Inner s2 = new Inner();//创建新的对象实例s2
//Inner s2 = s1;//让s2和s1指向同一对象
System.out.println(s2.a);//这样s2的属性也是10
}
class Inner {//成员内部类
public int a = 5;
}
public static void main(String[] args) {
Test_ t = new Test_();//创建外部类的新对象,会调用构造器
//1.10
//2.5
Inner r = t.new Inner();//用外部类的对象来创建成员内部类的对象实例
System.out.println(r.a);//成员内部类中的属性 a的值依然为5
}
}