内部类(2.17)

本文详细介绍了Java内部类的概念、使用场景、不同类型(成员、静态、局部和匿名)的特点,以及访问权限。特别强调了匿名内部类的作用和使用技巧,指出其在接口实现和方法参数中的应用价值。
摘要由CSDN通过智能技术生成
一.什么是内部类

定义在A类里面的类叫做内部类

A类叫做外部类

与外部和内部类无关的类叫做外部其他类

such as : 在一个A类内部定义B类,B类就叫内部类

 public class outer{
     public class Inner{
     }
 }
二.什么时候用到内部类:

such as :ArrayList类 的迭代器、汽车的发动器.......

三、内部类的访问特点
  • 在内部类中可以访问外部类的所有成员,包括私有的

  • 外部类要访问内部类的成员,必须创建对象

  • 内部类是外部类的一部分,内部类单独出现没有意义

四、内部类的分类
  • 成员内部类(了解)

  • 静态内部类(了解)

  • 局部内部类(了解)

  • 匿名内部类(重点)

五、成员内部类(了解)
1.编写注意点
  • 写在成员位置的,属于外部类的成员

  • 成员内部类可以被一些修饰符修饰。如:private、默认不写、protected、public、static等

  • jdk16以前不能在其中定义静态变量,jdk16开始才可以定义

2.如何创建成员内部类对象
  • 在外部类中编写方法,对外提供内部类对象(当内部类私有使用)

 public class Outer{
     String name;
     private class Inner{
         语句;
     }
     public Inner getInstance(){
         return new Inner();
     }
 }
 ​
 以上例子:在外部类Outer中包含私有的内部类Inner。
 通过getInstance方法,可以在测试类中直接获取内部类Inner对象
  • 直接创建

 外部类名.内部类名 对象名 = new 外部类名().new 内部类名()
 Outer.Inner oi = new Outer().new Inner()
3.内部类和外部类成员变量重名时,在内部类如何获取

在内部类中,会有一个隐藏的成员变量this,用于记录外部类的地址值

 System.out.println(外部类名.this.变量名);
 System.out.println(Outer.this.a);
六、静态内部类(了解)
1.注意事项
  • 静态内部类也是成员内部类一种,用static修饰

  • 静态内部类只能访问外部类中的静态变量和静态方法,如果访问非静态的需要创建外部类对象

2.创建静态内部类对象
 外部类名.内部类名 对象名 = new 外部类名.内部类名();
 Outer.Inner oi = new Outer.Inner();
3.获取内部类中的非静态方法
     创建对象后通过对象调用
 对象名.方法名();
     实例:
 Outer.Inner oi = new Outer.Inner();
 oi.show1();
4.调用内部类的静态方法
     可以通过类名调用
 外部类名.内部类名.方法名();
     实例:
 Outer.Inner.show2();
七、局部内部类(了解)
注意事项
  • 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量

  • 外界无法直接使用,须在方法内部创建对象使用

  • 该类可以直接访问外部类成员,也可以访问方法内的局部变量

代码解析
 public class Outer{
     int b = 20;
     
     
     public void show(){
         int a = 10;
         //局部内部类
         class Inner{
             int age;
             public void method(){
             //可以直接打印外部类的成员和所在方法内的局部成员
                 System.out.println(a);
                 System.out.println(b);
             }
         }
         //创建局部内部类对象
         Inner i = new Inner();
         i.age;
         i.method();
     }
     
     
 }
八、匿名内部类(重点)
1.什么是匿名内部类

隐藏了名字的内部类,可以写在成员位置,也可以在局部位置

2.格式
 new 接口名(存在实现关系)/类名(存在继承关系)(){
     重写方法;
 };
3.格式的细节
  • 包含了继承或实现,方法重写,创建对象

  • 实际上,匿名内部类创建的是一个对象;一个存在继承/实现关系的类的对象,且这个类没有名字

4.使用场景

当方法的参数是接口或者类时。

以接口为例。通过接口的多态,我们可以传递这个接口的实现类对象

如果该实现类只出现一次,就可以使用匿名内部类简化 代码

例:

5.弹幕
  • 有点像匿名函数的立即执行形式,就是类名的本质其实是刚给这个代码块起了一个别名,我们之后就可以用类名代替代码块;而这里我们选择直接使用代码块,而不创建类文件

  • 匿名类就是可以直接通过new 类名或者接口名,使用里面的方法(❌ 不全对)

  • 比如你一个类写计算方法并且方法里调用接口的一个计算方法(方法参数是你自己定义接口) 这时候外部调用计算方法,往参数传入 匿名内部类(new 接口)计算逻辑由匿名内部类代码定义

作者的话:

        都说匿名内部类比较重要,学过之后听抽象的。能听懂,但是不太明白具体干啥使。直到使用场景就会明白很多,这个知识点也准备多刷几遍

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值