首页 > 编程语言 >章10——面向对象编程(高级部分)——内部类

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

时间:2024-09-10 21:26:31浏览次数:10  
标签:10 内部 部类 void 高级 匿名 面向对象编程 new public

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

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() {
            @Override
            public 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(){
            @Override
            public void cry() {
                System.out.println("ok");
            }
        }.cry();

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

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

interface AA{
    void show();
}

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

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

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

public class InnerClassExercise02 {
    public static void main(String[] args) {
        Cellphone cellphone = new Cellphone();
        cellphone.alarmclock(new Bell() {
            @Override
            public void ring() {
                System.out.println("懒猪起床了");
            }
        });
        cellphone.alarmclock(new Bell() {
            @Override
            public 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

标签:10,内部,部类,void,高级,匿名,面向对象编程,new,public
From: https://www.cnblogs.com/gknives/p/18402383

相关文章

  • Contest7685 - 综合训练-105
    题目按难度顺序排序。C合体原题:P3147[USACO16OPEN]262144P\(O(n\times(V+\logn))\)TODO:\(O(n\logn)\)TODO:\(O(n)\)TODO:A迷宫设计注意到题目是特殊性质的最小生成树问题。直接Kruskal能获得没有什么分数的好成绩。注意到,根据Kruskal算法的过程,每次选......
  • LeetCode Hot100刷题记录-234.回文链表
    题目:给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。PS:回文序列是向前和向后读都相同的序列。解题思路:遍历链表,将每个元素存放入一个新的数组中。遍历完成后,再用两个指针前后遍历数组来判断两个数字是否相等。/***Def......
  • 微服务设计10个需要考虑的要素
    微服务是开发可扩展云原生系统的强大工具,但为了避免严重的系统灾难,需要认真设计才能成功。微服务并不是解决所有架构问题的普适方案,过度的设计、不当的应用和错误的理解容易导致系统灾难。选择正确的应用方向对于成功开发微服务极其重要,而权衡利弊做出正确的设计决策同样重要。下......
  • (喜报)于翱睿:下面,我正式宣布,逐梦工作室人数破10 热度破70000 成为猿编程中规模工作室
    截至2024年9月8日,于翱睿所负责的逐梦工作室人数正式破10,热度值破7万,升级成为猿编程中规模工作室,未来可期,再接再厉!我们非常高兴地宣布,经过一段时间的努力和发展,我们的工作室已经成功吸引了10名新成员加入,这一里程碑式的成就标志着我们的团队不断壮大,为未来的项目和发展奠定了坚......
  • jsp超市管理系统的设计与实现103v4 本系统(程序+源码+数据库+调试部署+开发环境)
    jsp超市管理系统的设计与实现10本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能超市公告,商品分类,用户,商品信息,商品入库,用户订单,商品出库,商品盘点技术要求:   开发语言:JSP前端使用:HTML......
  • 2024.9.10
    DATE#:202409010ITEM#:DOCWEEK#:TUESDAYDAIL#:捌月初捌TAGS<BGM="和光-闫东炜"><theme=oi-contest><[NULL]><[空]><[空]>```“不白”“不净”“不能”“不悟”```A.SpireRound#1红裤衩时间限制:1s 内存限制:512MB 测评类......
  • 2024.9.10 搜索引擎+字体
    今天是人工智能的第一节课!我们主要学了引擎的搜索以及字体两部分,干货满满!有一种走了20年弯路的感觉(⊙︿⊙)第一次拥有了博客账号,在我小学的时候我妈妈会用博客记录生活,对于博客有一种熟悉的陌生感hhha【知识小课堂1】搜索引擎分为两类:一、目录式分类搜索引擎,其特点是检索的准确......
  • P1110
    delicious#include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;multiset<int>delta,full;intst[500100],ed[500100];intsrt=inf;intn,m;voidupdate_srt(intx){ multiset<int>::iteratorit=full.lower_bound(x); intnw=*it......
  • 1001 害死人不偿命的(3n+1)猜想
    卡拉兹(Callatz)猜想:对任何一个正整数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结......
  • P1022 [NOIP2000 普及组] 计算器的改良
    P1022[NOIP2000普及组]计算器的改良题解题目链接P1022[NOIP2000普及组]计算器的改良题目大意给定一个合法有解的一元一次方程,其中只包含整数系数以及+,-,=,求该方程的解。如:\(6a−5+1=2−2a\)\(−5+y=2y+6\)等。大体思路按正常解方程思路来模拟,可以将原方......