章10——面向对象编程(高级部分)——内部类

news/2024/10/1 7:40:53

重点掌握匿名内部类的使用!

1、内部类可以随意访问外部类的成员,包括私有的属性,而外部类不可以。
2、内外部类有重名属性时,内部类的访问采用就近原则,如想访问外部的成员,则用外部类名.this.属性名。

内部类分类,四种

局部内部类


第七条解释:Outer02.this本质是一个外部类的对象。
匿名内部类
应用场景:一个函数中需要使用接口,但接口实现的类全程序中只会用一次,如果单独创建类会累赘,为了简化开发实现了匿名内部类。
1、本质仍然是类
2、内部类(如方法体、代码块内)
3、该类没有名字(系统给了但我们看不见不可用)
4、同时还是一个对象
5、相当于JDK底层立即创建了匿名内部类,并将地址返回给了tiger
6、匿名内部类使用一次,这个类就不能再使用,但给对象返回了实例,我们的对象是可以反复用的。

//tiger编译类型:IA
//tiger运行类型:匿名内部类
class A{public void f1(){IA tiger = new IA() {@Overridepublic void cry() {System.out.println("tigercry");}};tiger.cry();System.out.println(tiger.getClass());}
}interface IA{void cry();
}

输出结果(匿名内部类底层分配的类名):
tigercry
class com.innerclass.A$1
匿名内部类使用细节
1、语法奇特,既有类的定义,又本身是一个对象,故可以直接调用匿名内部类方法。如下:

 new IA(){@Overridepublic void cry() {System.out.println("ok");}}.cry();

2、可以随意访问外部类所有成员,包括私有
3、不能添加访问修饰符,因为其地位是一个局部变量。
4、内外互相访问的规则同局部内部类。
匿名内部类最佳实践案例

public class AnonymousInnerClassDetial {public static void main(String[] args) {f1(new AA() {@Overridepublic void show() {System.out.println("aaShow");}});}public static void f1(AA aa){aa.show();}
}interface AA{void show();
}

其中,实际上是向f1函数传递了如下实参:

new AA() {@Overridepublic void show() {System.out.println("aaShow");}}

类似上述使用方法,课堂上的练习题:

public class InnerClassExercise02 {public static void main(String[] args) {Cellphone cellphone = new Cellphone();cellphone.alarmclock(new Bell() {@Overridepublic void ring() {System.out.println("懒猪起床了");}});cellphone.alarmclock(new Bell() {@Overridepublic void ring() {System.out.println("小伙伴上课啦");}});}
}interface Bell{void ring();
}class Cellphone{public void alarmclock(Bell bell){bell.ring();}
}

匿名内部类涉及到的知识点
继承、多态、动态绑定、内部类等...
成员内部类
没有写在方法或代码块,而是直接写在外部类中成员的位置。 ”成员内部类“

和外部类的其他成员一样,为整个类体,比如前面案例,在外部类的成员方法中创建成员内部类对象,再调用方法。
外部其他类访问成员内部类的三种方法
1、outer.new Inner();
2、new Outer().new Inner();
3、在外部类中编写一个可以返回Inner类对象的方法。

静态内部类
静态类在地位上是一个静态成员,只能访问外部类的静态属性。

外部其他类访问静态内部类的方法
有三种:
1、outer.new Inner.f1();
2、new Outer().new Inner.f1();
3、通过一个方法来获取一个静态内部类的对象实例。

内外属性重名时
由于是静态的,所以直接外部类名.属性名就可以了,不必再加this

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/58870.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【整理】虚拟地址全解析:操作系统内存管理与进程调度的深度揭秘!

原创 freedom47概述 在现代计算机系统中,虚拟地址是内存管理的关键组成部分。 虚拟地址不仅帮助操作系统高效地管理物理内存,还在进程的内存分配中发挥重要作用。 本文将详细介绍虚拟地址的定义、作用、操作系统的内存管理、进程内存分配、32 位与 64 位架构的内存分配差异,…

SQL执行顺序和逻辑

SQL执行顺序和逻辑 MySQL的执行顺序:(9) SELECT (6) SUM(聚合函数) (10) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> …

2024.9.10 搜索引擎+字体

今天是人工智能的第一节课!我们主要学了引擎的搜索以及字体两部分,干货满满!有一种走了20年弯路的感觉(⊙︿⊙)第一次拥有了博客账号,在我小学的时候我妈妈会用博客记录生活,对于博客有一种熟悉的陌生感hhha 【知识小课堂1】 搜索引擎分为两类: 一、目录式分类搜索引擎,…

The Teachers Day gift a future teacher wants

`#include include void printBanner(); void printHeart(); void printFlower(); int main() { std::cout << "\n"; printBanner(); std::cout << std::endl; printFlower(); std::cout << std::endl; printHeart();return 0;}`点击查看代码 vo…

解决路由缓存问题

路由缓存问题即:当再vue3中使用带参数的路由时,随着路由跳转,组件被重新复用,不能正常执行生命周期 尤其我们通常在onMounted中使用的请求的发送,那么如何解决呢 1.粗暴的方法:强制替换销毁 vue官方曾说,key可以强制替换一个元素或者组件,而不是复用它 那么我们可以在组件中使用…

第二章python基本语法

位运算符 例1:检测列表里重复元素l=[1,3,5,7,8,3,9,4,2,5,6]flag=0for i in range(len(l)): if(1<<l[i]&flag)>0: print("重复:%d"%l[i]) flag|=(1<<l[i])#flag=flag|(1<<l[i]) 注:flag记录已经出现过的元素,其实用对应位为…