匿名内部类

ops/2024/10/11 5:28:45/

一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类,嵌套其他的类称为外部类。

类的五大成员:属性、方法、构造器、代码块、内部类

内部类最大的特点的就是直接访问私有属性,并且可以体现类鱼类之间的包含关系。

基本语法:

java">class Outer{  //外部类class Inner{   //内部类}
}
class Other{  //其他类
}

内部类的分类:

定义在外部类局部位置上(比如方法内)

①局部内部类(有类名)

内部类>匿名内部类(没有类名)

定义在外部类的成员位置上

①成员内部类(没有static修饰)

②静态内部类(使用static修饰)

---------------------------------------------------------------------------------------------------------------------------------

①局部内部类的使用

说明:局部内部类是定义在外部类的局部位置,比如:方法中,并且有类名

1、可以直接访问外部类的所有成员,包含私有的。

2、不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量不能使用修饰符。但是可以使用final修饰,因为局部变量也可以使用final。

3、作用域:仅仅在定义它的方法或代码块中。

4、局部内部类----访问---外部类的成员:直接访问。

5、外部类----访问---局部内部类的成员:创建对象,再访问。(必须在作用域中)

java">class Outer{private  int n=10;private  void x(){}public void m(){
//        不能添加访问修饰符,因为它的地位就是一个局部变量。public class Inner{  //报错public void f(){
//                可以直接访问外部类的所有成员,包含私有的。System.out.println("n="+n);x();}}
//        外部类----访问---局部内部类的成员
//        创建对象,再访问。(必须在作用域中,方法中)Inner inner=new Inner();inner.f();}}

6、外部其他类不能访问局部内部类。(因为局部内部类地位是一个局部变量)

7、如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以用   外部类名.this.成员   去访问。

java">public static void main(String[] args) {Outer outer=new Outer();outer.m();
}
class Outer{private  int n=10;public   void f(){System.out.println("我是外部类");}public void m(){
//        不能添加访问修饰符,因为它的地位就是一个局部变量。class Inner{int n=80;public void x(){System.out.println("n="+n);   // 输出80System.out.println("n="+Outer.this.n); //输出10
//                可以直接访问外部类的所有成员,包含私有的。}}
//        外部类----访问---局部内部类的成员
//        创建对象,再访问。(必须在作用域中,方法中)Inner inner=new Inner();inner.x();}}

---------------------------------------------------------------------------------------------------------------------------------

内部类>匿名内部类的使用

基本语法:

java">new  类或者接口(参数列表){//类体
};

①本质还是类  ②内部类  ③该类没有名字  ④同时还是一个对象

说明:内部类>匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名

基于接口的内部类>匿名内部类

需要重写接口的抽象方法

java"> public static void main(String[] args) {Outer outer=new Outer();outer.f();}
class Outer {public void f() {  //外部类的方法中//内部类>匿名内部类//利用接口并创建对象A a=new A() {//编译类型 A,运行类型:Outer$1(系统默认)@Overridepublic void m() {System.out.println("内部类>匿名内部类");}};//对象调方法a.m();}
}//接口
interface  A{
public  void  m();
}

内部类>匿名内部类也是一个对象,所以可以直接调用方法:

java">  new A() {//编译类型 A,运行类型:Outer$1(系统默认)@Overridepublic void m() {System.out.println("内部类>匿名内部类");}}.m();  //直接调用

结果:

基于类的内部类>匿名内部类写法一样

注意点和内部类一样。

例题:

代码:

java"> public static void main(String[] args) {
phone p=new phone();
p.alarm(new Bell() {@Overridepublic void ring() {System.out.println("打铃了");}
});}
interface  Bell{void ring();
}
class phone{public static void alarm(Bell bell){
bell.ring();}
}

结果:

---------------------------------------------------------------------------------------------------------------------------------

③成员内部类

成员内部类是定义在外部的成员位置,并且没有static修饰。

1、可以直接访问外部类的所有成员,包含私有的。

2、可以任意添加访问修饰符,因为它的位置就是一个成员。

java"> public static void main(String[] args) {A a =new A();a.t();
}
class A{private  int age=24;public  String name="张三";//成员内部类public class B{  //可以任意添加访问修饰符public  void  show(){System.out.println("姓名为:"+name+", 年龄为:"+age);}}//写方法public void  t(){//使用成员内部类B b=new B();b.show();}}

输出结果为:

3、作用域:和外部类的其他成员一样,为整个类体。

4、成员内部类访问外部类:直接访问。

5、外部类访问内部类 :创建对象,再访问

6、外部其他类访问成员内部类

---------------------------------------------------------------------------------------------------------------------------------

④静态内部类的使用

静态内部类是定义在外部类的成员位置,并且有static修饰

1、可以直接访问外部类的所有静态成员,包含私有的,但是不能直接访问非静态成员。

2、可以添加任意访问修饰符,相当于一个成员。

3、作用域:同其他的成员,为整个类体

4、静态内部类访问外部类:直接访问所有的静态成员

5、外部类访问内部类创建对象,再访问。

6、外部类访问静态内部类


http://www.ppmy.cn/ops/86965.html

相关文章

Java 枚举详解:看完立马掌握!

大家好,我是小欧! 今天我们来聊聊Java中的枚举(Enum)。枚举是Java中一种特殊的类型,用来表示一组固定的常量。如果你还没接触过枚举或者对它了解不多,别担心,看完这篇文章,你一定会对…

理解轮询与WebSocket:更新HTML内容的两种方式

理解轮询与WebSocket:更新HTML内容的两种方式 在开发Web应用时,更新页面内容的方式有很多,其中轮询(Polling)和WebSocket是两种常见的方法。了解这两种方法的区别、工作原理及其优缺点,有助于你选择最适合…

解决新Windows系统下Git克隆连接超时问题

最近,我在Windows系统的电脑上,尝试使用Git克隆项目时,不断遇到连接超时的错误。无论如何尝试调整环境变量或配置代理,都未能解决问题。因此,开始了一系列的问题排查。 排查步骤 首先,我在Git Bash终端使…

C语言系统调用linux文件系统

在C语言中,open、write和read函数是系统调用(system calls),它们直接由操作系统提供,用于底层的文件操作。这些函数是UNIX和类UNIX系统(如Linux)中的标准接口,不同于C标准库中的文件…

reduceByKey 函数详解

reduceByKey 函数详解 实现原理 reduceByKey 函数主要用于处理分布式数据集。它接收两个操作符作为参数: keySelector:这是一个映射函数,用于从输入元素中提取键。 valueReducer:这是另一个函数,用于将具有相同键的…

mac环境Qt Creator报错:Warning: You are changing a read-only file.

mac环境Qt Creator报错: Warning: You are changing a read-only file. 权限许可 文件权限问题 修改文件夹权限的基本语法: 打开终端:打开 macOS 中的终端应用程序。 sudo chmod -R permissions folder_pathchmod 是改变文件或文件夹权限…

鸿蒙(HarmonyOS)自定义Dialog实现时间选择控件

一、操作环境 操作系统: Windows 11 专业版、IDE:DevEco Studio 3.1.1 Release、SDK:HarmonyOS 3.1.0(API 9) 二、效果图 三、代码 SelectedDateDialog.ets文件/*** 时间选择*/ CustomDialog export struct SelectedDateDialog {State selectedDate:…

QT--线程

一、线程QThread QThread 类提供不依赖平台的管理线程的方法,如果要设计多线程程序,一般是从 QThread继承定义一个线程类,在自定义线程类里进行任务处理。qt拥有一个GUI线程,该线程阻塞式监控窗体,来自任何用户的操作都会被gui捕获到,并处理…