内部类

顾名思义,内部类的意思就是在类中再写一个类

内部类有:成员内部类、静态内部类、局部内部类和匿名内部类四种

成员内部类:

1). 在类的内部定义,与实例变量、实例方法同级别的类。

2). 属于外部类的一个实例部分,创建内部类对象,必须依赖外部类对象。

3). Outer out = new Outer();
Outer.Inner in = out.new Inner();

4). 当外部类、内部类存在重名属性时,有限访问内部类属性,通过外部类类名.this.外部类实例属性

5). 成员内部类不能定义静态成员。(比如内部类是一间锁着的屋子,而打开这房间的钥匙放在外部类对象手中,所以要想创建内部类就先要创建外部类对象,也就是拿着房间钥匙的人,而静态成员是再类加载的时候就存在的,可以通过类名.成员名访问的,所不行。)

public class TestInternal {

    public static void main(String[] args) {
        Outer out = new Outer();
        Outer.Inner in = out.new Inner();
        in.print();

    }

}
class Outer{
    private int a = 10;
    class Inner{//成员内部类
        int b = 20;
        public void print(){
            int c = 30;
            System.out.println(Outer.this.a);//访问外部类实例变量
            System.out.println(this.b);//访问内部类实例变量
            System.out.println(c);//访问内部类方法变量
        }
    }
}

静态内部类:

1). 不依赖外部类对象,可直接创建或通过类名访问,也可声明静态成员。

2)与静态属性和静态代码块等级相同。

3). Outer.Inner.静态成员
Outer.Inner in = new Outer.Inner();

4)作用:可以为外部类提供一些必要的初始行为

public static void main(String[] args) {
        //Outer.Inner in = new Outer.Inner();
        Outer.Inner.print();

    }

}
class Outer{
    int i = 0;
    static int a = 20;
    static class Inner{
        static int b = 10;
        public static void print(){
            //System.out.println(Outer.this.i);//静态不能访问非静态
            System.out.println(b);
            System.out.println(Outer.a);
        }
    } 
}


 

局部内部类:

1). 定义在外部类的方法中,作用范围和创建对象的范围仅限当前方法中。

2). 局部内部类访问外部类局部变量时,因无法保障变量的生命周期与自身相同,所以修饰为final。

(JVM栈中的局部变量在使用完之后就会释放内存空间,Heap堆中的对象在内存满了之后会JVM - GC垃圾收集器进行回收(非及时,也可手动回收(不建议)),方法区中的存储的类的信息会在类卸载之后释放空间(存在时间长),而常量就存储在方法去中的运行时常量池中)

3). 隐藏类的信息、限制类的使用范围。

class Outer{
    Printable p = null;
    
    //外部类实例方法
    public void m1() {
        
        /*final*/int b = 20; //Cannot refer to a non-final variable b inside an inner class defined in a different method
        
        class Inner implements Printable{
            @Override
            public void print() {
                //b = 30;//变量b必须是final修饰的常量
                System.out.println(b); //20 局部内部类访问外部类的局部变量,必须要加final(JDK8隐式存在final,JDK7中会编译错误,需要手动加final)
            }
        }
        
        p = new Inner();
    }
}

//父类、接口
interface Printable{
    public void print();
}

 

匿名内部类:

1)没有类名的局部内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

2). 必须继承一个父类或实现一个接口。

3). 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。

4). 优:减少代码量,书写的思路流畅。

5). 劣:可读性较差。

currentTeacher = new 父类名或接口名() {  };

 

 

 

 

 

 

 

 

 

 

 

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值