文章编号:11613时间:2024-10-01人气:
new
和一个匿名类声明来创建。该声明包含一个类体,其中定义了类的方法和变量。以下示例创建一个匿名内部类,它实现了
Runnable
接口:
new Runnable() {@Overridepublic void run() {System.out.println("这是一个匿名内部类示例!");}}.run();
Runnable$1
的类文件。生成的类文件包含指向封闭类的引用,因为它需要访问封闭类的成员。编译器还会生成一个方法来实例化匿名内部类,并调用其构造函数。
//匿名内部类甚至没有类名,(实际上有).所以匿名内部类,只有一个实例,而且没有引用.如下面那个Thread类的匿名子类,你不能重复使用.内部类,内部类有名字,但是他在类的内部.他能访问外部类的所有数据,包括private的.甚至如果一个内部类,是在一个方法内的话,方法的局部变量,内部类也可以使用.总体来说匿名内部类,和内部类效果差别不大.在事件监听和线程应用中经常使用.//匿名内部类public class T1 { public static void main(String[] args) {new Thread() { public void run() {(runing); }}(); }}//内部嵌套类public class T1 { private static final class Thread1 extends Thread {public void run() { (runing);} } public static void main(String[] args) {new Thread1()(); }}
java匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。 因他是局部内部类,那么局部内部类的所有限制都对其生效。 匿名内部类是唯一一种无构造方法类。 大部分匿名内部类是用于接口回调用的。 匿名内部类在编译的时候由系统自动起名Out$。 如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。 因匿名内部类无构造方法,所以其使用范围非常的有限。 当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。 匿名内部类中不能定义构造方法。 如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
示例如下:
匿名类可以使你的代码更加简洁 (JDK8之后Lambda更简洁)。
定义一个类的同时对其进行实例化。
它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要使用一次,就可以使用匿名类代替局部类。
匿名类是表达式,而非常规的类
匿名类的使用场景:一个局部类只需要使用一次的时候
由于匿名类没有类名,那么除了定义它的地方,其他地方无法调用,所以匿名类也可以叫匿名内部类
匿名类实现HelloWorld接口并创建了实例化对象:frenchGreeting */ HelloWorld frenchGreeting = new HelloWorld() { String name = 无参;
@Override public void greet() { greetSomeone(name); }
@Override public void greetSomeone(String someone) { name = someone; (匿名类: + name); } };
// 匿名类:无参方法 (); // 匿名类:带参方法 (带参);
###匿名类继承父类 (匿名子类)```jspublic class ExtendTest {public static void main(String[] args) {String name = 李四;// 创建父类对象,打印原始name值PartherClass partherClass = new PartherClass();(父类的getName方法= + ());// 使用匿名类继承父类,并打印name值PartherClass pc = new PartherClass(name){@Overridepublic String getName(){return 匿名类 - +();}};(());}}class PartherClass{private String name = 张三;public PartherClass(){}public PartherClass(String name){ = name;}public String getName(){return ;}}局部类public class HelloWorldAnonymousClasses {interface HelloWorld {public void greet();public void greetSomeone(String someone);}/** * 1、局部类:EnglishGreeting实现了HelloWorld接口 */class EnglishGreeting implements HelloWorld {String name = 无参;@Overridepublic void greet() {greetSomeone(name);}@Overridepublic void greetSomeone(String someone) {name = someone;(局部类: + name);}}// 创建局部类EnglishGreeting的实例化对象,使用接口类型接收HelloWorld englishGreeting = new EnglishGreeting();// 局部类:无参方法();// 局部类:带参方法(带参);匿名类的扩展:Java的lambda表达式 (Lambda表达式本身就是一个接口的实现)Lambda 表达式的作用其实就是匿名方法,而 Java 中并没有匿名方法这一语法。 不过 Java 中有匿名对象, 当你直接 new 一个接口并实现接口方法的时候,Java 编译器实际是产生了一个类(匿名类)来实现这个接口,然后再返回这个类的一个实例, 也就是匿名对象;
匿名类实现方式:@FunctionalInterfaceinterface HelloWorldFunction {void doSomeWork();}//new 一个接口并实现接口方法的时候,Java 编译器实际是产生了一个类 匿名类 来实现这个接口staticHelloWorldFunction helloWorldFunction = new HelloWorldFunction() {@Overridepublic void doSomeWork() {(doSomeWork--);}};函数式编程实现方式:static HelloWorldFunction helloWorldFunction = ()-> (doSomeWork--);箭头函数(箭头函数就是lambda表达式,提供了更简洁的function定义方式)Lambda 表达式的主要形式是如下定义,符号的左侧是参数,右侧是表达式或语句块。(参数列表) => { 语句块 }(参数列表) => 语句// 一条语句java lamda 表达式(将匿名函数复制给变量的简写方式的函数称为 lambda 表达式**。)@FunctionalInterfacepublic interface WorkerInterface {public void doSomeWork();}public class WorkerInterfaceTest {public static void execute(WorkerInterface worker) {();}public static void main(String [] args) {//invoke doSomeWork using Annonymous classexecute(new WorkerInterface() {@Overridepublic void doSomeWork() {(Worker invoked using Anonymous class);}});//invoke doSomeWork using Lambda expressionexecute( () -> (Worker invoked using Lambda expression) );}}函数式接口
1)Java8中Iterable的foreach(Comsumer action)的函数式接口 2)Java8中Iteror的forEachRemaining(Comsumer action)的函数式接口 3)Java8中函数式接口Predicate;Collections的removeIf(Predicate filter)
javascript 箭头函数var fun1 = funcation(int x,int y){return (x+y);}简写如下:
var fun1 = (x,y)=>x+y;结论:- 箭头函数适合于无复杂逻辑或者无副作用的纯函数场景下,例如用在map、reduce、filter的回调函数定义中;不要在最外层定义箭头函数,因为在函数内部操作this会很容易污染全局作用域。最起码在箭头函数外部包一层普通函数,将this控制在可见的范围内;
参考:02、Java的lambda表达式和JavaScript的箭头函数 - 掘金 ()
原文:分类:电脑/网络 >> 程序设计 >> 其他编程语言 问题描述: 内部类的使用有什么优点,什么情况下应考虑使用它呢? 匿名类使用有什么优点,什么情况下应考虑使用它呢? 解析: 提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。 内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦。 学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构。 下面从以下几个方面来介绍: 第一次见面public interface Contents { int value(); } public interface Destination { String readLabel(); } public class Goods { private class Content implements Contents { private int i = 11; public int value() { return i; } } protected class GDestination implements Destination { private String label; private GDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } public Destination dest(String s) { return new GDestination(s); } public Contents cont() { return new Content(); } } class TestGoods { public static void main(String[] args) { Goods p = new Goods(); Contents c = (); Destination d = (Beijing); } } 在这个例子里类Content和GDestination被定义在了类Goods内部,并且分别有着protected和private修饰符来控制访问级别。 Content代表着Goods的内容,而GDestination代表着Goods的目的地。 它们分别实现了两个接口Content和Destination。 在后面的main方法里,直接用 Contents c和Destination d进行操作,你甚至连这两个内部类的名字都没有看见!这样,内部类的第一个好处就体现出来了——隐藏你不想让别人知道的操作,也即封装性。 同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法,那就是利用其外部类的方法创建并返回。 上例中的cont()和dest()方法就是这么做的。 那么还有没有别的方法呢?当然有,其语法格式如下: outerObject=new outerClass(Constructor Parameters); innerObject= InnerClass(Constructor Parameters); 注意在创建非静态内部类对象时,一定要先创建起相应的外部类对象。 至于原因,也就引出了我们下一个话题—— 非静态内部类对象有着指向其外部类对象的引用 对刚才的例子稍作修改: public class Goods { private valueRate=2; private class Content implements Contents { private int i = 11*valueRate; public int value() { return i; } } protected class GDestination implements Destination { private String label; private GDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } public Destination dest(String s) { return new GDestination(s); } public Contents cont() { return new Content(); } } 修改的部分用蓝色显示了。 在这里我们给Goods类增加了一个private成员变量valueRate,意义是货物的价值系数,在内部类Content的方法value()计算价值时把它乘上。 我们发现,value()可以访问valueRate,这也是内部类的第二个好处——一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!这是一个非常有用的特性,为我们在设计时提供了更多的思路和捷径。 要想实现这个功能,内部类对象就必须有指向外部类对象的引用。 Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。 这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。 有人会问,如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用: 有了它,我们就不怕这种屏蔽的情况了。 静态内部类 和普通的类一样,内部类也可以有静态的。 不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。 这实际上和C++中的嵌套类很相像了,Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上,当然从设计的角度以及以它一些细节来讲还有区别。 除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。 不过静态内部类中却可以拥有这一切。 这也算是两者的第二个区别吧。 局部内部类 是的,Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内。 public class Goods1 { public Destination dest(String s) { class GDestination implements Destination { private String label; private GDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new GDestination(s); } public static void main(String[] args) { Goods1 g= new Goods1(); Destination d = (Beijing); } } 上面就是这样一个例子。 在方法dest中我们定义了一个内部类,最后由这个方法返回这个内部类的对象。 如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部,就可以这样做。 当然,定义在方法中的内部类可以使设计多样化,用途绝不仅仅在这一点。 下面有一个更怪的例子: public class Goods2{ private void internalTracking(boolean b) { if(b) { class TrackingSlip { private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip(slip); String s = (); } } public void track() { internalTracking(true); } public static void main(String[] args) { Goods2 g= new Goods2(); (); } } 你不能在if之外创建这个内部类的对象,因为这已经超出了它的作用域。 不过在编译的时候,内部类TrackingSlip和其他类一样同时被编译,只不过它由它自己的作用域,超出了这个范围就无效,除此之外它和其他内部类并没有区别。 匿名内部类 java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。 它的语法规则是这样的: new interfacename(){......}; 或 new superclassname(){......}; 下面接着前面继续举例子: public class Goods3 { public Contents cont(){ return new Contents(){ private int i = 11; public int value() { return i; } }; } } 这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象,看上去的确十分简洁。 在java的事件处理的匿名适配器中,匿名内部类被大量的使用。 例如在想关闭窗口时加上这样一句代码: (new WindowAdapter(){ public void windowClosing(WindowEvent e){ (0); } }); 有一点需要注意的是,匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。 如果你想要初始化它的成员变量,有下面几种方法: 如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。 将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。 在这个匿名内部类中使用初始化代码块。 为什么需要内部类? java内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。 由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。 不过你可能要质疑,更改一下方法的不就行了吗? 的确,以此作为设计内部类的理由,实在没有说服力。 真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题——没有多继承。 实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。 本文的目的只是向大家介绍一下内部类的概念以及使用方法,在后续文章里,将会针对本文中的内容举更多具体的例子,以及介绍如何使用内部类构建一个Applicaton Framework。
Java中,引入内部类是为了更好地组织和复用复杂结构,当某个结构仅在特定上下文下有用且不打算单独作为类使用时,内部类便显得尤为重要。 它就像是一个类的嵌套,外部类(外部事物)就像人的身体,内部类(器官)则提供特定服务。 内部类主要分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。 成员内部类可以作为外部类的成员,拥有完整的访问权限,但不能有静态资源;局部内部类仅在创建它们的方法内有效;匿名内部类用于一次性创建对象,避免命名问题,但可能影响代码的复用性;静态内部类则与外部类共享静态资源,非静态资源需通过实例化对象访问。 内部类的使用遵循一定的规则:外部类可以直接访问成员内部类的资源,但需要实例化内部类对象;其他类使用内部类则通常需要通过实例化来间接访问。 当外部类和内部类的属性或方法重名时,需要通过特定方式区分,如默认就近原则。 通过以上介绍,内部类为Java编程提供了灵活的结构组织方式,使得代码更加清晰且便于管理。 如果你想深入了解内部类的使用,可以参考实例,例如马士兵官方java编程学群聊中的相关资料。
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/c5af7337b7a0836cae5d.html,复制请保留版权链接!
w3wp.exe是一个可执行文件,它是一个IIS,InternetInformationServices,工作进程,当您访问一个使用IIS托管的网站时,w3wp.exe进程会处理您的请求并发送响应,在某些情况下,w3wp.exe过程可能会消耗过多的资源,这会导致网站性能下降或服务器崩溃,本文将探讨识别和修复w3wp.exe资源消耗过大...。
本站公告 2024-09-29 20:58:05
建立强大而难忘的企业形象在竞争激烈的数字时代,拥有一个以品牌为中心的网站是至关重要的,它不仅可以展示您的产品或服务,还可以培养您的受众、建立信任并创造持久印象,以品牌为中心网站设计的优势增强品牌识别度,网站是您品牌的主要接触点之一,通过保持一致的品牌元素,您可以提高品牌知名度并让用户轻松辨认您的业务,建立情感联系,一个以品牌为中心的网...。
最新资讯 2024-09-27 03:33:58
引言在数据库应用程序开发中,错误消息对于帮助用户了解应用程序中发生的问题至关重要,RAISERROR是Transact,SQL中的一个内置函数,可用于生成自定义错误消息,通过有效利用RAISERROR,开发人员可以提供更有信息和可操作性的错误消息,从而提高应用程序的可用性和用户体验,RAISERROR语法RAISERROR语法如下,R...。
技术教程 2024-09-25 11:45:48
Maven是一个流行的构建自动化工具,用于管理Java项目,其生命周期提供了从编译到部署的详细过程,Maven生命周期阶段Maven生命周期由一组阶段组成,每个阶段都有特定的任务,validate,验证项目配置,initialize,设置构建环境,generate,sources,生成源代码,如果需要,process,sources...。
本站公告 2024-09-15 10:03:41
使用ASP源代码,开发人员可以创建广泛的Web解决方案,包括,电子商务网站,销售产品、处理付款和管理订单,博客和论坛,创建内容丰富的平台,促进用户交互和社区建设,内容管理系统,轻松创建和管理Web内容,无需技术专长,协作工具,促进团队协作、文档共享和任务管理,数据驱动型应用程序,从数据库中获取数据并展示交互式图表和报告,Web开发的未...。
技术教程 2024-09-14 06:24:18
Address>,addresses,```懒加载懒加载只有在需要时才加载关联的实体,可以提高性能,```java@OneToMany,fetch=FetchType.LAZY,privateListaddresses,```缓存缓存可以存储查询结果,从而减少数据库交互和提高性能,```java@CacheablepublicLi...。
最新资讯 2024-09-13 22:57:39
SQLDatabase、GoogleCloudSQL如何选择合适的数据库管理系统选择合适的DBMS取决于以下因素,数据类型和结构查询和修改操作的复杂性并发性要求性能和可扩展性安全性考虑成本和许可通过考虑这些因素,您可以选择满足您特定需求的最合适的数据库管理系统,结论数据库管理系统是管理和使用数据库的必不可少工具,它们提供了一系列功能,...。
技术教程 2024-09-13 07:36:01
引言在电子商务蓬勃发展的时代,拥有一个强大的在线商城至关重要,Java商城,集强大功能和灵活性于一身,为企业提供了一个理想的解决方案,助力其在线业务蓬勃发展,强大功能全面的产品管理Java商城提供全面的产品管理功能,让企业可以轻松添加、管理和更新其产品目录,用户可以创建产品类别、设置产品属性、管理库存和跟踪订单,灵活的购物车灵活的购物...。
互联网资讯 2024-09-11 23:41:45
前言在大数据时代,面对海量的数据,如何高效地获取有价值的洞察至关重要,聚合函数是SQL中用于对数据进行汇总和统计的有力工具,可以大幅简化复杂查询,并从庞大的数据集中提取关键信息,本文将深入探讨聚合函数的用法,展示如何使用它们来优化复杂查询,并从海量数据中获取有意义的见解,什么是聚合函数,聚合函数是将一组值聚合为单个值或一组汇总值的函数...。
互联网资讯 2024-09-10 10:58:36
简介three.js是一个流行的JavaScript库,用于创建和渲染3D图形,它可以让你在网页上创建交互式和逼真的3D场景,步骤1,设置要开始使用three.js,你需要,一个文本编辑器一个网络服务器,如Nginx或Apache,three.js库步骤2,创建场景我们需要创建一个场景,它将包含所有3D对象,constscene=ne...。
技术教程 2024-09-09 15:18:57
引言JavaScript是一种高度通用的编程语言,广泛用于构建交互式Web应用程序和网站,作为一名JavaScript程序员,掌握最佳实践、技巧和故障排除策略至关重要,以提高效率并编写高质量的代码,本文旨在为JavaScript程序员提供一个综合资源,涵盖这些关键领域,帮助他们成为更有效的开发者,最佳实践变量声明使用`const`和`...。
互联网资讯 2024-09-06 23:08:57
20世纪30年代,上海发生了多起离奇的失踪事件,引发了一场关于,上海吸血鬼,的城市传说,这些可怕的传说伴随着令人毛骨悚然的图片,至今仍然流传着,失踪人口激增1934年,上海这座繁荣的大都市开始出现大量人口失踪,受害者来自各个阶层,包括富人、穷人、男人和女人,失踪事件最初并未引起注意,但随着失踪人口数量的增多,引发了公众的恐慌,吸血鬼传...。
互联网资讯 2024-09-04 04:52:19