内部类
在一个类的内部,再定义一个类(一般内外存在某种联系)
成员内部类
- 在类的内部定义,与实例变量,实例方法同级别的类
- 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
public class Outer {
private int id;
public void out(){
System.out.println("这是外部类的方法");
}
/*
* 内部类也会生成class文件(Body$Arm.class文件)
* 内部类可以直接访问外部类的私有成员,而不破坏封装
* 可以为外部类提供必要的内部功能组件
* */
class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
public void getId(){
System.out.println(id);
}
}
}
测试
public class TestOuter {
public static void main(String[] args) {
//创建外部类
Outer outer = new Outer();
//通过外部类 来实例化内部类
Outer.Inner inner = outer.new Inner();
inner.in();//这是内部类的方法
inner.getId();//1
}
}
静态内部类
public class Outer {
private int id;
public void out(){
System.out.println("这是外部类的方法");
}
/*
* 静态内部类,由于是静态
* 静态内部类比外部非静态成员更早执行
* */
public static class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
/*public void getId(){
System.out.println(id); 这里就无法获得了
}*/
}
}
局部内部类
public class Outer {
//在方法中写内部类:局部内部类
public void method(){
class inner{
public void in(){
System.out.println("我是局部内部类");
}
}
}
}
// 一个Java类中可以有多个class类,但只能有一个public class
class A{
}
匿名内部类
public class Test {
public static void main(String[] args) {
//没有名字初始化类,不用将实例保存到变量中
new Apple().beEaten();
//甚至可以n匿名实例化接口
new Userservice(){
@Override
public void hello() {
System.out.println("hello");
}
};
}
}
class Apple{
public void beEaten(){
System.out.println("a");
}
}
interface Userservice{
void hello();
}