Java内部类学习笔记

非静态内部类

一个源文件中只能有一个类被修饰成public

内部类是外部类成员,可以使用任意访问控制符:private、protected、public和不用(只有内部类可用private)

外部类无法在其内部直接访问非静态内部类成员(反过来可以),要访问则要想访问其他类一样,在内部创建内部类对象,用该内部类对象访问内部类成员
事实上外部类和非静态内部类间可以互访对方的成员,即使对方成员是用private修饰

非静态内部类继承某一父类,实现某一接口和定义子类(其子类不一定非得是内部类,但其实例需要保留指向该内部类所在的外部类对象的应用,所以创建其要该内部类存在,即该外部类要先存在)都和非内部类一样

非静态内部类内不能定义静态成员,除非将其改为静态内部类

非静态内部类与外部类关系

非静态内部类对象须寄存在外部类对象里,如心脏和人的关系(相对于在人这个类的内部发现心脏也是一个类,要对其封装),即:有外部类对象不一定有非静态内部类对象,反之则一定

让B类作为A类的内部类
可使B类可以访问A类的private成员
可使B类不被同一包下的类访问

外部类属性、内部类属性和内部类方法的局部变量重名可用this,外部类名.this 区分

外部类外创建非静态内部类对象

OuterClass outer = new OuterClass();
OuterClass.InnerClass notStaticOne = outer.new InnerClass();

静态内部类

静态内部类内不能有静态初始化块,可有普通初始化块

static修饰符是把对象作用于向上提一层,外部类的上一层作用域是包,不可用static修饰,内部类可以,其上一层作用域是外部类,所以在外部类外部使用语法就像使用全包名调用一样

静态内部类内可有静态成员和非静态成员,但这些成员都不能访问外部类非静态成员(和其他外部类静态成员规则一样,可理解成静态成员存在时,非静态成员不一定存在(在还没创建对象实例时))
外部类依然不能直接访问静态内部类的成员,但可以用静态内部类类名或创建静态内部类对象作为调用者访问内部类成员

接口里可定义内部类,会隐式加上public static修饰,如显示加修饰符也只能用public和static
(接口内还可以定义接口,然并卵,因为接口是暴露在外的规则,规则内不必再定义内部规则)

外部类外创建静态内部类对象

OuterClass.InnerClass staticOne = new OuterClass.InnerClass();

前两类对比

public class TestInner
{
    public static void mainJ(String[] args){
    A a = new A();
    A.B b = a.new B();
    A.C c = new A.C();
}
}

class A
{
    class B
    {

    }

    static class C
    {

    }
}

局部内部类

-局部内部类,作用域在方法内,是局部成员,所以不能用权限修饰符,用static修饰无意义,
-不能访问外部其他方法的作用域,只有访问局部中被final修饰的变量

匿名内部类

内部类的简写格式,其实是一匿名子类对象,编译会出多个类文件,其必须继承或实现一外部类或接口
new 匿名内部类,此类要先定义,当在方法中的形参需要在方法中的内部类内使用时,该形参要加final修饰

不能用static和abstract修饰,因为要的就是个对象
内部隐含为final,不能定义构造器,因为无类名

public class TestInner2
{
    static void g(A a)
    {
        a.f();
    }
    public static void main(String[] args){
    g(new A(){
        public void f(){
            System.out.println("aaaaa");
        }
    });

    new A(){
        public void f(){
            System.out.println("ddddd");
        }
    }.f();
    }
}

interface A
{
    void f();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值