Java内部类

内部类的分类

  1. 成员内部类(包括实例内部类和静态内部类)
  2. 局部内部类
  3. 匿名内部类

一、成员内部类

成员内部类都是定义在类中
实例内部类
1)在创建实例内部类的实例时,外部类的实例必须已经存在
2)实例内部类的实例自动持有外部类的实例的引用。在内部类中,可以直接访问外部类的所有属性和方法。
3)在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问
4)实例内部类中不能定义静态属性和方法,而只能定义实例属性和方法
5)如果实例内部类B与外部类A包含同名的成员,那么在类B中, this.v(或者v)表示类B的成员, A.this.v表示类A的成员

public class BasicTest {
    private int i = 3;
    private static int i2 = 1;
    
	//内部类1 -- 实例内部类
    public class Inner{
        public int i2;  //实例内部类不能有静态变量和方法

        public void main() {
            int i2 = 2;
            //访问变量i2的时候,按照作用域从小到大来决定(访问顺序:方法中、内部类、外部类)
            System.out.println("实例内部类可以调用外部类的所有方法和属性"+i+i2);
            //需要访问外部类的静态或实例变量,要通过外部类的类名或实例访问
            System.out.println("外部类实例变量i="+new BasicTest().i+"外部类静态变量i2="+BasicTest.i2);
        }
    }
	
	public static void main(String[] args) {
        System.out.println("实例内部类:");
        BasicTest bt = new BasicTest();
        bt.new Inner().main();
 	}

}

结果:
实例内部类:
实例内部类可以调用外部类的所有方法和属性32
外部类实例变量i=3外部类静态变量i2=1

静态内部类
1)在创建内部类的实例时,不必创建外部类的实例
2)静态内部类可以直接访问外部类的静态属性和方法,如果访问外部类的实例成员,就必须通过外部类的实例去访问
3) 在静态内部类中可以定义静态成员和实例成员
4) 可以通过完整的类名直接访问静态内部类的静态成员 例:A.B.x;

public class BasicTest {
    private int i = 3;
    private static int i2 = 1;

	public static void main(){
        System.out.println("main方法可以重载");
    }    

	public void say(){
        System.out.println("这是个外部类实例方法");
    }

	//内部类2 -- 静态内部类
    public static class Ineer2{
        public static long l;
        public long l2 = 5;
        public static void say(){
            System.out.println("静态内部类可以有静态变量和实例变量,也可以有静态方法和实例方法");
        }

        public void say2(){
            System.out.println("静态内部类可以直接访问外部类的静态变量和方法"+i2);
            main();
            //访问实例变量和方法时,要使用外部类的实例
            BasicTest bt = new BasicTest();
            bt.say();
            System.out.println("外部类实例变量i="+bt.i);
        }
    }
	
	public static void main(String[] args) {
        System.out.println("静态内部类");
        BasicTest.Ineer2.say();
        Ineer2 in2 = new Ineer2();
        in2.say2();
 	}

}

结果:
静态内部类
静态内部类可以有静态变量和实例变量,也可以有静态方法和实例方法
静态内部类可以直接访问外部类的静态变量和方法1
main方法可以重载
这是个外部类实例方法
外部类实例变量i=3

局部内部类 – 在方法中定义的类
1)局部内部类只能在当前方法中使用
2)不能包含静态成员
3)不能被public等访问修饰符修饰
4)可以访问外部类的所有成员,以及方法中的变量

public class BasicTest {
    private int i = 3;
    private static int i2 = 1;
    
	public static void main(){
        System.out.println("main方法可以重载");
    }    

	public void say(){
        System.out.println("这是个外部类实例方法");
    }

	public void test(){
        System.out.println("外部类不能访问局部内部类");
        //内部类3 -- 局部内部类 能不能加任何修饰符(public、static等)
        class Inner3{
            public char c = 'a';    //局部内部类不能有静态变量和静态方法
            public void main3(){
                //局部内部类可以直接访问外部类的所有属性和方法
                System.out.println(""+c+i+i2);
                main();
                say();
            }
        }
        //只能在方法中new局部内部类的对象
        Inner3 i3 = new Inner3();
        i3.main3();
    }
	
	public static void main(String[] args) {
		System.out.println("局部内部类");
		BasicTest bt = new BasicTest();
        bt.test();
 	}
}

结果:
局部内部类
外部类不能访问局部内部类
a31
main方法可以重载
这是个外部类实例方法

匿名内部类
匿名内部类一般用于实现接口

interface A {
    void a();
}

public class BasicTest {
	private int i = 3;
    private static int i2 = 1;
	
	public static void main(){
        System.out.println("main方法可以重载");
    }

	public static void main(String[] args) {
		//匿名内部类
        A a = new A() {
            @Override
            public void a() {
                System.out.println(i2);
                System.out.println("匿名内部类的实现");
                main();
            }
        };
        a.a();
    }
}
结果:
匿名内部类的实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值