内部类即类或者方法内定义的类,根据位置的不同可分为成员内部类、局部内部类。
成员内部类
定义于类中
Class A{
//这里B就是成员内部类
Class B{
}
}
如何访问成员内部类?
格式: 外部类名.内部类名 对象名= 外部对象.内部对象
这里即: A.B b= new A().B()
实际使用中常将内部类设为私有,通过外部类来间接调用/访问内部类的方法和变量。
Class A{ Private Class B{ public void show(){ System.out.println("B"); } }
//间接 public void visitB(){ B b= new B(); b.show(); } } public class aaa { public static void main(String[]args) { A a=new A(); a.visitB(); } }
当成员内部类为静态
注意: 静态成员内部类访问访问外部类成员时,只能访问静态成员(方法和变量)
关于内部类与外部有同名变量时的访问问题
class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; //三个变量对应的变量名相同 //访问的是本方法中的num变量,满足就近原则 System.out.println(num); //通过this变量,访问方法外,本类中的变量,this代表Inner类对象 //这里Inner.this同this
System.out.println(this.num); //通过外部类名加this,返回外部类对象,访问对象外部类的num System.out.println(Outer.this.num); } } } public class niming { public static void main(String[]args) { Outer.Inner inner=new Outer().new Inner(); inner.show(); } }
------------------------------------------------------------------------------------------------------------------------------------------------
局部内部类
定义于方法或作用域中的类
备注: 局部内部类当然也是处于某个类或接口中,因为方法得处于类或接口中。
特性: 局部内部类可访问final或static类型的外部类成员。
详情可见: https://blog.csdn.net/u014745069/article/details/80210288
------------------------------------------------------------------------------------------------------------------------------------------------
另外,与定义位置无关,有种特殊的内部类,称为:
匿名内部类
定义: 继承了某个类或实现了某接口的匿名类,用 new 类名 或 new 接口名 的格式创建。
备注: 我们创建匿名类的同时也创建了一个匿名类实例,不需要class关键字。
特性:
1. 匿名类不能是abstract
2. 匿名类隐式final
3. 匿名类不能是static
eg:
A hello = new A() { public void run() { System.out.println("hello"); } };
个人理解:本质上就是创建A的实例并覆盖、实现其中的方法
访问权限:
1. 访问外层Class里面的字段。
2. 不能访问外层方法中的本地变量。除非变量是final。
3. 如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。
4. 不能定义静态初始化代码块
5. 不能在匿名类里面定义接口
6. 不能在匿名类中定义构造函数