Java:内部类

目录

内部类

1.简述

2.内部类相较于外部类的优势

3.分类

                局部内部类

                1.简述 2.特点 3.优势 4.例子

                匿名内部类*

                1.简述 2.特点 3.优势

                成员内部类

                1.简述 2.特点 3.优势

                静态内部类

                1.简述 2.优势

                额外注意点:


内部类

1.简述

  • 内部类,方法,属性,代码块,构造器是Java类的五大成员,搞清楚内部类将会对面向对象的编程思想有进一步的理解和感悟。

2.内部类相较于外部类的优势

  • 内部类可以直接调用类中封装的属性和方法;
  • 内部类不为同一包下的外部类所见,具有良好的封装性;
  • 不同的内部类各有其自己的优势,详见下文对四种内部类的详解;

3.分类

  • 内部类可分为:局部内部类,匿名内部类,成员内部类和静态内部类。

局部内部类

1.简述

  • 局部内部类顾名思义就是作用域只为局部的内部类,即定义在外部类的代码块或者方法中的类。

2.特点

  • 不能用除了"final"以外的任何修饰符,因为它的地位相当于一个局部变量,而局部变量是不能加除了"final"以外的任何修饰符的;

3.优势

  • 局部内部类的创建和调用只能在其局部的作用域中,所以其具有良好的封装性;

4.例子

public class local_inner {
    public static void main(String[] args) {
        local_inner localInner = new local_inner();
    }
    {
        class AnlocalInner{
            AnlocalInner(){
                System.out.println("AnlocalInner have been created.");
            }
    }
        AnlocalInner anlocalInner = new AnlocalInner();
    }
}
  • 输出结果为"AnlocalInner have been created."

匿名内部类*

1.简述

  • 匿名内部类顾名思义是运行类型无法直接看到的内部类(但可以通过getClass()方法得到),是四个内部类中最重要的一个也是最难理解的一个。

2.特点

  • 运行类型无法直接看到,需要我们通过getClass()方法查看,以以下代码为例子:
public class Anonymous_inner{
    public static void main(String[] args) {
        System.out.println(new father(){}.getClass());
    }
}
class father{
}

输出结果:

class Anonymous_inner$1

可见该类的实际运行类型并不是father而是以外部类名+"$"+编号命名,且运行类型只会在内存中出现一次,一旦其地址被father类所引用,下一个产生的匿名外部类编号就会+1;

  • 不能用除了"final"以外的任何修饰符,因为它的地位相当于一个局部变量;

3.优势

  • 匿名内部类的创建和调用也只能在其局部的作用域中,所以其具有良好的封装性;
  • 匿名内部类既是一个类的定义同时本身也是一个对象,可以调用匿名内部类的方法,且匿名内部作用在局部,内存用完就会释放,当我们需要用到某个接口或者某个类的一个方法时,匿名内部类是不二之选。
  • 可以当作实参直接传递,简洁高效,见以下实例:
public class Anonymous_inner{
    public static void main(String[] args) {
        id(new father() {
        });
    }

    static void id(father father){
        System.out.println(father.getClass());
    }
}
interface father{
}

输出结果:

class Anonymous_inner$1

成员内部类

1.简述

  • 作用域为整个类区域,地位等同于类的方法和属性,相当于类的一个成员而得名。

2.特点

  • 典型的内部类;
  • 可以添加任何修饰符,因为他的地位就是一个成员;

3.优势

  • 可以为外部所使用,如下示例:
public class member_inner {

    public static void main(String[] args) {
        //方法一
        member_inner memberInner = new member_inner();
        member_inner_class member_inner_class = memberInner.new member_inner_class();
        //方法二
        member_inner_class member_inner_class1 = new member_inner().new member_inner_class();
        //方法三 使用一个方法来获取
        member_inner_class member_inner_class2 = new member_inner().getInstance();
    }
    class member_inner_class{}

    public  member_inner_class getInstance() {
        return new member_inner_class();
    }
}

静态内部类

1.简述

  • 静态的成员内部类。

2.优势

  • 可以且只可以使用类方法和类属性;
  • 可以不用新建一个外部类来创建静态内部类:
public class member_inner {

    public static void main(String[] args) {
        //方法一
        member_inner_class member_inner_class1 = new member_inner.member_inner_class();
        //方法二
        member_inner_class member_inner_class2 = member_inner.getInstance();
    }
    static class member_inner_class{}

    public static member_inner_class getInstance() {
        return new member_inner_class();
    }
}

额外注意点:

  • 当内部类和外部类的属性重名时,默认遵循就近原则,
  • 除静态内部类外的内部类若要调用外部属性则要通过: 外部类名.this.属性名来调用      这里的 外部类名.this 的本质就是指向当前这个正在执行操作的外部类对象。
  • 静态内部类若要调用外部属性则要通过: 外部类名.属性名来调用 (静态内部类是静态的,无法使用"this"方法,同时静态内部类调用额只能是外部类的静态属性或者静态方法,也无需使用this指向。)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YHanJG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值