分为四类:
①成员内部类
成员内部类的语法例:
class MyOuterClass{
String outValue;
class MyInnerClass{
String inValue;
public void testInner(){
System.out.println("this is testInner() ");
}
}
}
获得成员内部类的对象,我们可以在外部类MyOuterClass类中通过写一个方法来获取
public void testOuter(){
MyInnerClass in =new MyInnewClass();
in.testInner();
}
也可以通过两次实例化来获取
MyOuterClass out=new MyOuterClass();
MyOuterClass.MyInnerClass in =out.new MyInnerClass();
in.testInner();
成员内部类中也可以获取外部类的私有属性,成员内部类的封装
public class MyOuterClass1 {
private String outValue;
class MyInnerClass{
String inValue;
public void testInner(){
System.out.println(outValue);
System.out.println("this is testInner() ");
}
}
public void testOuter(){
MyInnerClass in = new MyInnerClass();
in.testInner();
System.out.println(outValue);
}
成员内部类可以继承其他的外部类,并且可以进行多态。
成员内部类的this
class OuterClass {
private String instanceStr="外部类的实例变量";
private static String staticStr="外部类的静态变量";
public void testInner(){
class Inner{
private String instanceStr="内部类的实例变量";
public void innerPrint(){
//访问的是内部类的实例变量
//因为重名时,内部类的成员优先级更高
System.out.println(this.instanceStr);
//如果想明确的使用外部类的this
//那么就必须在this之前加上外部类的类名
System.out.println(OuterClass.this.instanceStr);
System.out.println(staticStr);
}
}
Inner inner=new Inner();
inner.innerPrint();
}
}
②静态内部类
class MyOuterClass{
String outValue;
static class MyStaticInnerClass{
String inValue;
public void testInner(){
System.out.println("this is testInner() ");
}
}
public void testOuter(){
System.out.println("this is testOuter!");
}
}
如何创建静态内部类对象
class MyOuterClass{
String outValue;
static class MyStaticInnerClass{
String inValue;
public void testInner(){
System.out.println("this is testInner() ");
}
}
public void testOuter(){
MyStaticInnerClass m = new MyStaticInnerClass();
m.testInner();
}
}
MyOuterClass.MyStaticInnerClass in = new MyOuterClass.MyStaticInnerClass();
in.testInner();
l在成员内部类中能访问外部类中所有静态成员、非静态成员,但不可以定义静态方法
l在静态内部类中只能访问外部类的静态成员,可以定义静态方法
③局部内部类:
定义在方法内部的类被称为局部内部类。在局部内部类中可以用过外部类的类名调用外部类的静态成员(静态方法和静态成员)。
//局部内部类的语法
class MyOuterClass{
private int value1 = 1 ;
private static int value2 = 2;
public void testOuter(){
class MyInnerClass{
public void testInner(){
System.out.println("this is testInner()"+value1);
System.out.println("this is testInner()"+value2);
}
}
MyInnerClass m = new MyInnerClass();
m.testInner();
}
}
局部内部类不能继承其他的类,也不能实现接口。可以在同一个方法的不同局部内部类中的方法相互调用。
局部内部在访问局部变量时,局部变量必须声明成final
④匿名内部类
匿名内部类是特殊的局部内部类
当满足如下2个条件时可以选择应用匿名内部类
局部内部类可能就需要创建一个对象
局部内部类需要实现外部接口,或者继承某些父类
interface MyInterface{
void m1();
}
new MyInterface(){};
new MyInterface(){
public void m1(){
System.out.println("this is m1 implements ");
}
}
//或者是
interface MyInterface {
void m1();
}
public void InnerTest() {
final int localVar =10;
MyInterface mi;
mi=new MyInterface() {
@Override
public void m1() {
System.out.println("匿名内部类实现的m1方法");
System.out.println(localVar);
}
};
mi.m1();
}