内部类的分类

分为四类:

 

①成员内部类

 成员内部类的语法例:

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();
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值