内部类
在Java中可以将一个类定义在另一个类的内部
内部类可以定义在 类的内部(与类成员层次一致)
内部类可以定义在 方法/块内部(与类成员相差一个层次 与方法的局部变量一个层次)
-
成员内部类
将一个类直接定义在类的里面,作为成员,与属性或方法层次一致
成员内部类可以与正常类一样 可以用不同的修饰符来修饰
好处1. 省略了一个.java文件
好处2. 成员内部类中可以访问外部类的所有成员 包括私有
若想要在内部类中通过对象**.调用外部类成员 要使用外部类.this.外部类成员**的形式
内部类存在后 源码进行编译 产生一个字节码 Demo$InnerDemo.class -
*局部内部类
将一个类定义在方法/块里面,作为成员的内部结构,与临时的局部变量一个层次
局部内部类像是一个局部变量一样,不能用public protected private及static
只能用final或abstract
局部内部类命名规则 Demo$1InnerTestMethod Demo$2InnerTestMethod
局部内部类可以访问外部成员,也可以访问局部变量,但是要求局部内部类中使用的变量都需要加final修饰
因为局部内部类 编译之后字节码就已经定义好了,而普通变量的内容是可以改变的,所以要加final修饰,保证变量在编译之后无法改变内容
public class Demo {
private String name = "这是正常类中的属性";
public void testDemo() {
System.out.println("这是正常类中的方法");
}
public void testDemoOne() {
String s = "abc";
//定义局部内部类
class InnerTestMethod{
}
}
public void testDemoTwo() {
//定义局部内部类
class InnerTestMethod{
}
}
//成员内部类
public class InnerDemo{
private String name = "我是内部类的属性";
public void testInnerDemo() {
System.out.println("我是成员内部类的方法"+this.name);
Demo.this.testDemo();
}
}
}
- *匿名内部类
成员匿名内部类
局部匿名内部类
public interface Test{
public void test();
}
public class Son implements Test{
public void test(){
}
}
//多态
Test t = new Son();
//匿名内部类
public interface Test{
public void test();
}
Test t = new Test(){
public void test(){
}
};
**通常接口或抽象类的具体子类这样写**
开发中为了省略一个类文件 用上述方法
匿名内部类很特殊只有类体,没有类的所有结构(修饰符 名字 继承 实现)
不能用任何修饰度来修饰,匿名内部类也没有构造方法(因为它连名字都没有)
- 静态内部类
成员静态内部类
不需要外部类对象,通过正常的方式直接创建内部类
静态元素不能访问非静态成员(自己类和外部类)
package innerclass;
public class Demo {
private String name = "这是正常类中的属性";
public void testDemo() {
System.out.println("这是正常类中的方法");
}
public void testDemoOne() {
String s = "abc";
//定义局部内部类
class InnerTestMethod{
String s = "asd";
}
}
public void testDemoTwo() {
//定义局部内部类
class InnerTestMethod{
public void testInnerInnerTestMethod() {
System.out.println("我是局部内部类的方法");
}
}
}
//成员内部类
public class InnerDemo{
private String name = "我是成员内部类的属性";
public void testInnerDemo() {
System.out.println("我是成员内部类的方法 "+ this.name);
//通过 外部类.This.外部成员 访问外部类成员
Demo.this.testDemo();
}
}
//静态内部类
public static class InnerDemoStatic{
String name = "InnerDemoStatic";
public void testInnerDemoStatic() {
System.out.println("我是静态内部类的方法" + name);
}
}
}
package innerclass;
import innerclass.Demo.InnerDemo;
import innerclass.Demo.InnerDemoStatic;
public class TestMain {
public static void main(String[] args) {
// 创建外部类对象
Demo demo = new Demo();
//通过外部类对象.创建成员内部类
InnerDemo innerDemo = demo.new InnerDemo();
innerDemo.testInnerDemo();
//静态内部类和普通类一样直接创建
InnerDemoStatic ids = new InnerDemoStatic();
ids.testInnerDemoStatic();
}
}
/*
我是成员内部类的方法 我是成员内部类的属性
这是正常类中的方法
我是静态内部类的方法InnerDemoStatic
*/