Java 内部类 和 匿名内部类

 

From:https://www.cnblogs.com/geeksongs/p/9836154.html

 

 

一,内部类

 

其实内部类是十分简单的,我们根据其字里行间的意义就可以知道内部类应该是一个类当中的一个类,相当于一个类进行了嵌套,就如同循环的嵌套一般。

内部类有一个特征:内部类当中可以调用外部类当中的属性和方法,而外部类却不能调用内部类当中的。除了这特征就没啥特征了,我们来看看代码了解一下(点击代码上方的文档小图标就可以复制代码,因为我加了代码的行号看起来整洁一些,但是复制可能不太方便):

package com.company;public class Innerclass {public static void main(String[] args) {System.out.println("下面是是内部类的程序展示");//创建外部类和内部类的方法有点不相同AAA a=new AAA();// 这里开始创建内部类的对象,这是创建内部类对象的专用格式,// 相当于在创建了一个外部类对象的基础上再创建一个内部类对象2AAA.BBB b=new AAA().new BBB();a.say2();b.sayit();}
}class AAA
{int waibu=12;public void say2(){System.out.println("这是外部类当中的方法");}class BBB{int neibu=13;public void sayit(){System.out.println("这是内部类里面的方法");System.out.println("使用内部类和外部类当中的数值进行想加的结果是"+(neibu+waibu));//之所以内部类可以使用外部类的属性是因为在创建对象的时候,//已经给内部类的对象附加了一个外部类的对象,内部类的对象是建立在外部类对象的基础上的。}}
}

最终的sayit()方法输出结果是25=(13+12),从中可以证明内部类确实是可以调用外部类的属性的,但如果外部类调用内部类的属性则会发生报错。

 

 

二.匿名内部类

 

首先我们应该知道匿名内部类匿名是因为匿名内部类的具体名字不会被我们在程序当众编写出来,因为它已经在主方法当中被实例化了。

匿名内部类可以继承两类数据结构:

  • 一:抽象类
  • 二:接口。

比如我们的代码有:

package com.company;public class Innerclass {public static void main(String[] args) {Chouxiang c = new Chouxiang() {String name = "Geek Song too";public void say3() {System.out.println("这是匿名内部类当中的方法,重写了抽象类的方法");System.out.println(name);}};}
}abstract class Chouxiang
{String name="Geek Song";//抽象类的属性是不会被调用的,除了方法public void say3(){System.out.println("这是抽象类当中的方法,抽象类当中是允许有具体方法来进行实现的,接口不行");}
}

这显然继承了一个抽象类,并且在主方法当中创建了抽象类的对象,本来我们是应该先继承这个抽象类再开始创建对象的,否则对象是无法创建的,但是为了简便,人们创建了了匿名内部类,允许我们在主方法当中进行抽象类的实例化,同时也可以进行对象的创建。这个程序就等同于如下的程序:

package com.company;public class Innerclass {public static void main(String[] args) {System.out.println("下面是是内部类的程序展示");//创建外部类和内部类的方法有点不相同AAA a=new AAA();AAA.BBB b=new AAA().new BBB();a.say2();b.sayit();System.out.println("现在开始匿名内部类程序的编写\n");Chouxiang2 c=new Chouxiang2();c.say3();}
}class AAA
{int waibu=12;public void say2(){System.out.println("这是外部类当中的方法");}class BBB{int neibu=13;public void sayit(){System.out.println("这是内部类里面的方法");System.out.println("使用内部类和外部类当中的数值进行想加的结果是"+(neibu+waibu));//之所以内部类可以使用外部类的属性是因为在创建对象的时候,//已经给内部类的对象附加了一个外部类的对象,内部类的对象是建立在外部类对象的基础上的。}}
}abstract class Chouxiang
{String name="Geek Song";//抽象类的属性是不会被调用的,除了方法public void say3(){System.out.println("这是抽象类当中的方法,抽象类当中是允许有具体方法来进行实现的,接口不行");}}class Chouxiang2 extends Chouxiang
{public void say3(){System.out.println("这是继承的方法");}
}

因此这里就会涉及到多态和向上转型了,我们输出的子类的方法,父类的属性,匿名内部类也是相同的。输出的匿名内部类的方法,以及父类的属性。

 

 

完整的程序如下,方便大家进行知识点的理解:

 

示例代码:

package com.company;public class Innerclass {public static void main(String[] args) {System.out.println("下面是是内部类的程序展示");//创建外部类和内部类的方法有点不相同A a = new A();A.B b = new A().new B();a.say2();b.sayit();System.out.println("现在开始匿名内部类程序的编写\n");Chouxiang c = new Chouxiang() {String name = "Geek Song too";public void say3() {System.out.println("这是匿名内部类当中的方法,重写了抽象类的方法");System.out.println(name);}};//在使用匿名内部类的时候,当这个类在陈述完之后,是需要打分号的。c.say3();System.out.println("我们来看看这个name到底是抽象类当中的name还是匿名内部类当中的" + c.name);//结果果然是父类当中的属性,和我们多态的性质相重合了//这就是所谓的向上转型。现在我们再来试试接口的匿名内部类实现Jiekou yui = new Jiekou() {@Override//由于必须实现接口当中的方法,因此计算机就自动为我们写上了override的标识符了public void say5() {System.out.println("这是继承的接口当中的方法");}};yui.say5();}
}class A {int waibu = 12;public void say2() {System.out.println("这是外部类当中的方法");}class B {int neibu = 13;public void sayit() {System.out.println("这是内部类里面的方法");System.out.println("使用内部类和外部类当中的数值进行想加的结果是" + (neibu + waibu));//之所以内部类可以使用外部类的属性是因为在创建对象的时候,// 已经给内部类的对象附加了一个外部类的对象,// 内部类的对象是建立在外部类对象的基础上的。}}
}// 虽然内部类的程序已经成功了,但是匿名内部类的程序还没有成功,
// 现在我们来创建一个匿名内部类(在主方法当中,首先应该创建一个抽象类或者接口)
abstract class Chouxiang {String name = "Geek Song";//抽象类的属性是不会被调用的,除了方法public void say3() {System.out.println("这是抽象类当中的方法,抽象类当中是允许有具体方法来进行实现的,接口不行");}}interface Jiekou {public void say5();}

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造一个宇宙 星系模拟产生对宇宙进化惊人见解

图片来源:TNG COLLABORATION来源:中国科学报摘要:研究人员不断发展宇宙模型,并借此发现新的宇宙理论。美国加州理工学院理论物理学家Philip Hopkins喜欢跟他的同事恶作剧。作为模拟星系形成的专家,Hopkins有时会在演讲…

Scrapy 性能

参考:https://blog.csdn.net/s150503/article/details/72571680 CONCURRENT_REQUESTS 与 DOWNLOAD_DELAY Scrapy 中 CONCURRENT_REQUESTS 与 DOWNLOAD_DELAY 的联系,先建立一个项目来找CONCURRENT_REQUESTS与DOWNLOAD_DELAY的联系 以豆瓣电影top250 为例…

在CentOS6虚拟机上安装VirtualBox增强功能

1. 安装编译需要的库和头文件yum install gcc -yyum install kernel sources -yyum install kernel-devel -y2. 安装VirtualBox增强功能3. 重新启动系统转载于:https://www.cnblogs.com/wdpp/archive/2011/07/13/2386255.html

5G 发展报告:以四项技术为基础,广泛应用还需十年

来源:36Kr摘要:近年来,在5G领域的竞争非常激烈。但5G的部署与应用到底是一个什么样的过程?人们到底需要多久才能普遍用上5G技术?日前,CB Insights发表了一篇报告,在对无线技术的背景进行研究的基…

33个优秀的 jQuery 图片展示插件分享

这篇文章收集了33个优秀的 jQuery 图片插件分享给大家。jQuery 是一个非常优秀的 JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,其中最令人印象深刻的应用之一就是对图片的处理,它可以让帮助你在你的项目中加入一…

安卓逆向_13 --- AndroidStudio + Smalidea 动态调试 smali 代码【APK可调试】、gradle 配置

教我兄弟学Android逆向04 动态调试smali代码:https://www.52pojie.cn/thread-658865-1-1.html From:Android Studio 3.6 调试 smali:https://blog.csdn.net/jha334201553/article/details/104494732 From:SmalideaIntelliJ IDEA/…

IEEE协会首次在京举办研讨会,王飞跃称不存在AI芯片

本文来源:网易智能摘要:6月9日至10日,IEEE SMC学会(IEEE System,Man,and Cybernetics Society)与中国自动化学会、中国科学院自动化研究所、青岛智能产业技术研究院共同在京举办IEEE人工智能与控…

Lucene提供的条件判断查询[转]

Lucene提供的条件判断查询[转] 第一、 按词条搜索 - TermQuery query new TermQuery(new Term("name","word1")); hits searcher.search(query); 这样就可以把 field 为 name 的所有包含 word1 的文档检索出来了。 第二、 “与或”搜索…

安卓逆向_14 --- 单机和弱联网游戏内购 突破口 和 思路

From:https://www.bilibili.com/video/BV1UE411A7rW?p41 Android 逆向资源收集( apk ):https://blog.csdn.net/qq_36869808/article/details/79290420 Android逆向-Android基础逆向7(内购干货集合)&#…

OpenAI最新研究:如何通过无监督学习提升「自然语言理解能力」?

来源:amazonaws.com摘要:长期以来,使用无监督(预)训练来提高区别性任务的性能表现一直是机器学习研究的一个重要目标。最近,OpenAI通过使用一个具有可扩展性的任务不可知系统,在一系列不同的自然…

安卓逆向_15( 一 ) --- JNI 和 NDK

From:较详细的介绍JNI:https://blog.csdn.net/lizhifa2011/article/details/21021177 From:https://www.jb51.net/article/126111.htm NDK 官方文档:https://developer.android.google.cn/training/articles/perf-jni JNI / NDK …

Nature:科学家成功绘制出大脑神经细胞“地图”

图片来源:Thomas Hainmller, Marlene Bartos来源:生物谷摘要:最近,一项刊登在国际杂志Nature上的研究报告中,来自弗莱堡大学的科学家们通过研究开发出了一种新型模型来解释大脑如何储存一些“有形事件”(ta…

互联网的大脑模型与原子的太阳系模型,科学史上的巨系统对比

作者:刘锋 计算机博士,互联网进化论作者科学探索中,有两种重要的促进力量,第一种是认同,会帮助研究者增强对探索方向的信心和勇气,第二种是批判,会帮助研究者获知探索路上的障碍和陷阱。10年前…

安卓逆向_15( 二 ) --- Android Studio 3.6.3 JNI 环境配置 和 so 生成开发 demo

From:Android Studio 3.0 JNI 的实现:https://blog.csdn.net/ziyoutiankoong/article/details/79696279 Android Studio 生成so包和.H文件给jni调用产生新so包。(即so包调so包):https://blog.csdn.net/sxh_android/article/details/80694291…

SQL经典语句(转载)

一、基础<?XML:NAMESPACE PREFIX O ?> 1、说明&#xff1a;创建数据库CREATE DATABASE database-name 2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBac…

卡内基梅隆大学机器学习系副主任邢波:AI落地现在最缺的是思维方式

来源&#xff1a;亿欧摘要&#xff1a;邢波认为&#xff1a;人工智能现在最缺的不是算法和知识&#xff0c;而是落地应用的思维方式&#xff1b;数据如何被处理、系统如何被调试、资源如何配置&#xff0c;目前阶段还处于黑箱&#xff0c;很混沌的状态&#xff1b;人工智能未来…

安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

Android Studio开发JNI示例&#xff1a;https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : https://pan.baidu.com/s/1wpTYA9euSdPqE1Z2bA_BHA 提取码: 7h97 错误: 编码GBK的不可映射字符 ( https://blog.csdn.net/talenter111/article/de…

scrapy-redis 使 redis 不止保存 url(例如:json)

scrapy-redis 使 redis 不止保存 url&#xff1a;https://my.oschina.net/u/4382439/blog/3712637 Scrapy-redis 和 Scrapyd 用法详解&#xff1a;https://zhuanlan.zhihu.com/p/44564597 Scrapy-redis GitHub 地址&#xff1a;https://github.com/rmax/scrapy-redis scrapy…

学界 | DeepMind等机构提出「图网络」:面向关系推理

来源&#xff1a;机器之心摘要&#xff1a;近日&#xff0c;由 DeepMind、谷歌大脑、MIT 和爱丁堡大学等公司和机构的 27 位科学家共同提交的论文《Relational inductive biases, deep learning, and graph networks》引起了人们的关注。深度学习虽然精于分类&#xff0c;但一直…

oracle 11g 下载地址

oracle 11g 下载地址&#xff1a;http://download.oracle.com/otn/nt/oracle11g/win32_11gR1_database.zip不需要注册&#xff0c;直接复制到迅雷或其他下载软件中即可下载。转载于:https://www.cnblogs.com/snake-hand/archive/2011/07/25/2452273.html