内部类: 所谓内部类就是在一个类内部进行其他类结构的嵌套操作(可以理解为将一个类定义在另一个类的内部)。
内部类可以定义在类的内部(与类成员层次一致),也可以定义在块、方法的内部(与类成员相差一个层次,与方法的局部变量在一个层次)
内部类的优点:
- 内部类与外部类可以方便的访问彼此的私有域(比如私有方法、私有属性);
- 内部类是另外一种封装,对外部的其他类隐藏;
- 内部类可以实现Java的单继承局限。
1.成员内部类
将一个类直接定义在类里,作为成员,与属性或方法层次一致;
成员内部类与正常类一样可以使用不同的修饰符来修饰;
好处:
省略了一个.java文件;
成员内部类中可以访问外部类中的所有成员,包括私有的;
若想要在内部类中通过对象.调用外部类成员:
外部类.this.外部类成员;
内部类存在后,源代码进行编译,会产生一个字节码: Demo$InnerDemo.class
2.局部内部类
将一个类定义在方法、块中,作为成员的内部结构,与临时的局部变量一个层次;
局部内部类像一个局部的变量一样,不能用public、protected、private、static,只能使用abstract或final。
局部内部类命名规则Demo$1InnerTestMethod Demo$2InnerTestMethod
局部内部类使用的变量只能是final修饰
*3.匿名内部类
成员匿名内部类
局部匿名内部类
public interfase Test{
public void test();
}
Test t = new Test(){
public void test(){
}
};
通常接口或抽象类的具体子类这样写
开发中为了省略一个类文件 上述写法比较常见
匿名内部类很特殊 只有类体 没有类的所有结构( 修饰符 名字 继承 实现)
不能用任何修饰符来修饰 匿名内部类也没有构造方法
Swing 做一个按钮 绑定一个事件监听器
4.静态内部类
成员静态内部类
不需要外部类对象,通过正常的方式直接创建内部类
静态元素不能访问非静态成员(自己类和外部类)
package innerclass; public class Demo { private String name = "这是正常类中的属性"; public void testDemo(){ System.out.println("这是正常类中的方法"); } //成员内部类 public class InnerDemo{ private String name="我是成员内部类的属性"; public void testInnerDemo(){ //可以访问外部类的private或静态元素,当和外部类冲突时,直接引用属性名,是内部类的成员属性 System.out.println("我是成员内部类的方法:"+this.name);
//当和外部类属性名重叠时,可通过外部类名.this.属性名
System.out.println("我是成员内部类的方法:"+Demo.this.name);
//外部类名+this+外部类成员 Demo.this.testDemo(); } } public void testDemoOne(){ String s = ""; //局部内部类 不能使用public protected private static class InnerTestMethod{ } } private static class InnerDemoStatic{ } } package innerclass; import innerclass.Demo.InnerDemo; public class Test { public static void main(String[] args){ //内部类属于外部类的(相当于是一个成员) 需要外部类对象才能操作 //创建内部类的对象---调用内部类的方法 Demo demo = new Demo(); InnerDemo innerDemo = demo.new InnerDemo(); innerDemo.testInnerDemo(); } }