内部类
可以将一个类定义到另一个类的内部
成员内部类
将一个类直接定义在类的里面,与属性或方法层次一致
和正常的类一样,可以用不同的修饰符
优点:
1、省略一个.java文件
2、可以访问外部类所有的成员(包括私有的)
若想要在内部类中通过对象.调用外部类成员:
外部类.this.外部类成员
内部类存在后,源代码进行编译,产生一个字节码文件
Demo$InnerDemo.class
Demo.java
package innerclass;
public class Demo {
private String name = "这是正常类的属性";
public void testDemo(){
System.out.println("这是正常类的方法");
}
public class InnerDemo{
private String name = "我是内部类的属性";
public void testInnerDemo(){
System.out.println("我是成员内部类方法" + Demo.this.name);//调用正常类属性
testDemo();
}
}
}
TestMain.java
package innerclass;
public class TestMain {
public static void main(String[] args){
//内部类相当于外部类的一个成员,需要外部类对象才能操作
//创建内部类对象-----构建内部类的方法
Demo demo = new Demo();
Demo.InnerDemo innerDemo = demo.new InnerDemo();
//调用内部类方法
innerDemo.testInnerDemo();
}
}
局部内部类
将一个类定义在方法或者块里,作为成员的内部结构,与局部变量一个层次
局部内部类像一个局部变量一样不能用public、protected、private及static修饰,只能用abstract、final修饰
不同方法中两个内部类名字可以相同
局部内部类字节码命名规则:
Demo$1InnerTestMethod、Demo$2InnerTestMethod
使用内部的变量要用final修饰
匿名内部类:成员匿名内部类、局部匿名内部类
public interface Test{
public void test(){}
}
//public class Son implements Test{
// public void test(){}
//}
Test test = new Test(){
public void test(){
}
};
通常接口或者抽象类的具体子类这样写
可以省略一个类文件,所以开发中比较常见
只有类的结构体,没有类的所有结构,自然也没有构造方法
不能用任何修饰符修饰
静态内部类
成员静态内部类
不需要外部类对象,通过正常的内部类直接创建对象
不能访问非静态成员(内部、外部)