匿名对象+内部类

匿名对象

普通的类对象在使用时会定义一个类类型的变量,用来保存new出来的类所在的地址。而匿名类取消掉了这个变量,这个地址由编译器来处理,并且在new出来之后,它占用的内存会有JVM自动回收掉。后续无法再使用了。
例如

public class Student{ public void classBegin(){ System.out.println("good morning teacher!"); } } new Student().classBegin();

匿名对象最常用的方式是作为函数的参数,比如上述的打印语句 "good morning teacher!" 它就是一个匿名对象,由于字符串是以对象的形式存储的,所以这里实际上就是一个没有使用对象引用的匿名对象。

当然也可以将匿名对象作为函数的返回值。

内部类

内部类的种类:成员内部类、静态内部类、局部内部类、匿名内部类

成员内部类

java中允许在一个类中定义另一个类。例如

public class Car{ public class Engine{ } }

上述例子在Car这个类中定义了一个Engine类,那么Car就是外部类,而Engine就是内部类。

使用内部类需要注意:外部类是包含内部类的,所以内部类可以看到外部类的所有属性和方法,包括private方法。但是反过来则不行;

使用内部类主要有两种方式:

  • 在外部类中使用内部类的成员(间接使用)。这种方法一般是在外部类的方法中创建内部类的对象,并调用对象的方法
  • 直接使用:根据上面的定义,可以这样使用 `Car.Engine eng = new Car().new Engine()

局部内部类

内部类不光可以直接定义在外部类中作为成员内部类,也可以定义在方法中,作为局部内部类

局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类

主要特定有:

  • 局部内部类只能在对应方法中访问,在方法外无效
  • 不能使用private,protected,public修饰符。
  • 不能包含静态成员
  • 局部内部类如果想要访问方法中的局部变量时,局部变量必须是常量。因为局部变量时分配在栈中,而局部内部类是分配在堆中的,有可能出现这样的情况,外部类的方法执行完了,内存被回收了,但是局部内部类可能还在,所以在访问局部变量时,做了一个拷贝将局部变量拷贝到局部内部类所在的堆中。为了保证数据的完整性,所以这里被拷贝的变量不允许再做修改。
public class carShow(){ public void showCar(){ final float price = 10000000f; final String type = "奔驰"; class Car(){ public void show(){ System.out.println("这个车是" + type + ",售价:" + price); } } } }

静态内部类

内部类如果使用static声明,则此内部类就称为静态内部类。它可以通过 外部类 . 内部类 的方式来访问。由于静态内部类是与对象无关的,在使用静态类的成员时是不需要创建对象的。所以如果想要在静态内部类中来访问外部类的成员变量,必须通过外部类的对象实例来访问。

public class Company { String companyNam; static String country; static class Clear{ String name; public Clear() { } public Clear(String name) { super(); this.name = name; } public void work(String name){ String na = new Company().companyNam="联想"; country="中国"; System.out.println(name+"为"+na+"打扫卫生,该公司属于"+country); } } }

匿名内部类

如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。

匿名内部类,一般都伴随着接口一起使用比如

public interface USB{ public abstract void open(); public abstract void close(); } public class Demo{ public static void main(String[] args){ USB usb = new USB(){ public void open(){} public void close(){} } usb.open(); usb.close(); //使用匿名内部类的匿名对象的方式 USB usb = new USB(){ public void open(){} public void close(){} }.open(); } }

转载于:https://www.cnblogs.com/sy130908/p/11433015.html

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

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

相关文章

听技术播客:一边学Python编程一边学英语

本文转自:http://codingpy.com/article/recommended-python-podcasts/ 学技术的朋友一般都会关注不少技术博客(blog),但是关注技术播客(podcast)的人估计不会太多。这里一方面也是由于相关的播客数量&#…

mysql补充

mysql补充 mysql使用流程 开启服务端,mysqld或者net start mysqlcmd下键入mysql -u root -p,输入设置好的密码,连接mysql客户端show databases;展示所有的mysql仓库创建一个库:create database CRM;然后sho…

编程书单:十本Python编程语言的入门书籍

本文转自:http://codingpy.com/article/10-python-beginner-books/ 本文与大家分享一些Python编程语言的入门书籍,其中不乏经典。我在这里分享的,大部分是这些书的英文版,如果有中文版的我也加上了。有关书籍的介绍,大…

JavaScript异步

JavaScript异步类型 延迟类型:setTimeout、setInterval、setImmediate监听事件:监听new Image加载状态、监听script加载状态、监听iframe加载状态、Message带有异步功能类型: Promise、ajax、Worker、async/awaitJavaScript常用异步编程 Prom…

Sublime配置与各种插件

本文转自:http://www.cnblogs.com/yyhh/p/4232063.html Sublime Text 3 安装Package Control 点击View -> Show Console 在下方命令行内,输入以下命令。 import urllib.request,os;pfPackage Control.sublime-package;ippsublime.installed_packages_…

把Sublime Text 2打造成一个轻量级Python的IDE

本文转自:http://blog.l1n3.net/python/sublime-text-to-python-ide/ 因为这段时间迷上了Python,所以想吧Sublime Text 2弄成一个Python的简易IDE,Python自带的IDLE简直太难用!!!! 配置Python环…

数据库表操作、数据类型及完整性约束

数据库表操作、数据类型及完整性约束 库操作补充 数据库命名规则: 可以由字母、数字、下划线、@、#、$区分大小写唯一性不能使用关键字如 create select不能单独使用数字最长128位表操作补充 #语法: create table 表名…

算法第一次作业

1.代码规范(由于日后可能会用C和Java,就找了两种) Google C代码规范:https://blog.csdn.net/freeking101/article/details/78930381 Ggoogle Jave代码规范:https://www.jianshu.com/p/4e50269037ed 2.《数学之美》读后…

Sublime Text官方文档 中英文版本

英文版本:http://docs.sublimetext.info/en/latest/index.html 中文翻译版本:http://sublime-text.readthedocs.org/en/latest/reference/build_systems.html

第99:真正理解拉格朗日乘子法和 KKT 条件

转载于:https://www.cnblogs.com/invisible2/p/11441485.html

有了CodinGame,玩着游戏就能学编程

本文转自:http://www.codingpy.com/article/learning-to-code-becomes-a-game/ 今天编程派向大家推荐一个有趣的编程练习平台,而它与其他平台的差异,就在于它将编程练习变成了一个个游戏。这个平台的名字叫CodinGame,是一家法国创…

第98:svd原理

SVD分解:任何矩阵都可以分解成第一行的形式,3个相乘。UV都是正交矩阵,中间的是奇异值。 3个相乘的形式可以拆分。即奇异值*第一行*第一列。在相加。 奇异值有时很小,在这种情况下,丢掉,可以减少计算量&…

Python学习(变量与字符串)

print()、input()、if/else就可以做一个简陋的游戏 print() # 打印函数,将信息打印出来input() # 将信息打印,并且要求输入一段话,并且把这段话。input函数,这个函数会将字符串显示在IDLE上,并且让用户输入信息&#…

第97:一文读懂协方差与协方差矩阵

转载于:https://www.cnblogs.com/invisible2/p/11442777.html

Python清屏小结

1. cmd–>python import os i os.system(cls) 2.通用的清屏 def cls(): print("\n"*100) 3.为idle增加一个清屏的扩展ClearWindow 首先下载clearwindow.py(点击可直接下载,不能下载的可以右键保存,格式为py结尾&#xff0…

设计模式之模板方法模式实战解析

本文微信公众号「AndroidTraveler」首发。 背景 最近在看《设计模式之禅》,为了能够更加深入的理解设计模式,达到学以致用。 这边记录一下自己的一些感受和看法,并结合具体代码实战来进行说明。 模板方法模式 但凡和设计模式挂上钩&#xff0…

LIBSVM在MATLAB中的使用及SVM最优参数选取示例代码

1. 参考网站: LIBSVM 库下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/ https://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html?js1#svm-toy-js 视频: http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html 详解&#xff1…

Date类+DateFormat

Date 类 Date 表示特定的瞬间,精确到毫秒。 毫秒概念:1000毫秒1秒 毫秒的0点: System.currentTimeMillis() 返回值long类型参数 用于获取当前日期的毫秒值 时间的原点:公元1970年 一月一日,午夜0:00&#…

Random Forest 资源汇总(待续)

决策树 http://leijun00.github.io/2014/09/decision-tree/ http://leijun00.github.io/2014/10/decision-tree-2/ http://blog.csdn.net/suipingsp/article/details/41927247 http://blog.csdn.net/suipingsp/article/details/42264413 http://isilic.iteye.com/blog/184…

python 运行当前目录下的所有文件

查看当前目录下所有py文件(本身除外run) import osfile_list os.listdir(os.getcwd()) # 获取当前目录下所有的文件名print(file_list)for filename in file_list: if os.path.isfile(filename) and filename.endswith(.py) and filename.find(&quo…