匿名内部类java中 匿名内部类有什么作用?

匿名内部类  时间:2021-09-27  阅读:()

匿名类与内部类

提起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 = p.cont(); Destination d = p.dest("Beijing"); } } 在这个例子里类Content和GDestination被定义在了类Goods内部,并且分别有着protected和private修饰符来控制访问级别。

Content代表着Goods的内容,而GDestination代表着Goods的目的地。

它们分别实现了两个接口Content和Destination。

在后面的main方法里,直接用 Contents c和Destination d进行操作,你甚至连这两个内部类的名字都没有看见!这样,内部类的第一个好处就体现出来了——隐藏你不想让别人知道的操作,也即封装性。

同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法,那就是利用其外部类的方法创建并返回。

上例中的cont()和dest()方法就是这么做的。

那么还有没有别的方法呢?当然有,其语法格式如下: outerObject=new outerClass(Constructor Parameters); outerClass.innerClass innerObject=outerObject.new 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里用如下格式表达外部类的引用: outerClass.this 有了它,我们就不怕这种屏蔽的情况了。

静态内部类 和普通的类一样,内部类也可以有静态的。

不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。

这实际上和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 = g.dest("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 = ts.getSlip(); } } public void track() { internalTracking(true); } public static void main(String[] args) { Goods2 g= new Goods2(); g.track(); } } 你不能在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的事件处理的匿名适配器中,匿名内部类被大量的使用。

例如在想关闭窗口时加上这样一句代码: frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); 有一点需要注意的是,匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。

如果你想要初始化它的成员变量,有下面几种方法: 如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。

将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。

在这个匿名内部类中使用初始化代码块。

为什么需要内部类? java内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。

由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。

不过你可能要质疑,更改一下方法的不就行了吗? 的确,以此作为设计内部类的理由,实在没有说服力。

真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题——没有多继承。

实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。

本文的目的只是向大家介绍一下内部类的概念以及使用方法,在后续文章里,将会针对本文中的内容举更多具体的例子,以及介绍如何使用内部类构建一个Applicaton Framework。

JAVA中的匿名内部类

选B,C A;匿名类与其说一个类,不如说他是一个表达式,因为写匿名类是在一个表达式里面写的,所以要注意写完一个匿名类后要在结尾写一个“:” D;new Boo(String s){};这里的内部类虽然继承了Boo,但是这里实例化的类与Bar一点关系都没有(虽然他们都继承了Boo类,就像三角形和四边形继承自形状,你能说三角形是四边形吗) E;匿名类不像普通的内部类,不要向E一样要Boo.Bar(String s){}; 这样写,这样写没有任何意义 new Bar(){} 和new Bar()的区别在于,第一个相当于继承了Bar类然后实例化Bar的子类对象(也就是说第一个是之类对象),后一个就是Bar对象 匿名类就是一个没有名字的,把继承类与实例化子类对象压缩在一个表达式里面 Boo(String s){}, Boo(){}这是统一各位类中的两个构造方法,没有什么关系,都是用来初始化对象的,一个是有参数的,一个是没有参数的,在实例化对象时,只能选择其中一个

java中 匿名内部类有什么作用?

你要去理解什么是内部类,内部类的作用,java的多态,什么是回调函数。

匿名内部类是当做函数的参数传递给方法的,在这个方法中,会用接口类型接受传入的匿名类,然后调用其方法,这是多态。

原理其实是实现了回调。

因为他会调用你匿名内部类中的方法。

给你举个例子:手敲的代码,未经测试 interface InterfaceA{ String go(); } class Test(){ public void prtGo(InterfaceA ia){ System.out.println(ia.o()); } public static void main(String []args){ Test t = new Test(); t.prtGo(new InterfaceA(){ public String go(){ return "go"; } }); } }

hostodo:2021美国独立日7折优惠促销NVMe硬盘的VPS,低至$13/年,还送DirectAdmin授权

7月4日是美国独立日,大致就是国庆节的意思吧。hostodo今年提前搞了个VPS大促销活动,4款便宜VPS,相当于7折,续费不涨价,本次促销不定时,不知道有多少货,卖完为止。VPS基于KVM虚拟,NVMe阵列,1Gbps带宽,自带一个IPv4+/64 IPv6,solusvm管理,送收费版DirectAdmin授权,VPS在用就有效! 官方网站:https://www.hostodo.com ...

ZoeCloud:香港BGP云服务器,1GB内存/20GB SSD空间/2TB流量/500Mbps/KVM,32元/月

zoecloud怎么样?zoecloud是一家国人商家,5月成立,暂时主要提供香港BGP KVM VPS,线路为AS41378,并有首发永久8折优惠:HKBGP20OFF。目前,解锁香港区 Netflix、Youtube Premium ,但不保证一直解锁,谢绝以不是原生 IP 理由退款。不保证中国大陆连接速度,建议移动中转使用,配合广州移动食用效果更佳。点击进入:zoecloud官方网站地址zo...

无忧云:洛阳BGP云服务器低至38.4元/月起;雅安高防云服务器/高防物理机优惠

无忧云怎么样?无忧云,无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点。一、无忧云官网点击此处进入无忧云官方网站二...

匿名内部类为你推荐
宝安网站制作宝安网站制作比较好的网络公司ros驱动电机电机驱动芯片 synchronous rectification 什么意思裂缝检测关于房屋墙体裂缝要如何检验华为技术华为技术有限公司怎么样?长角牛网络监控机长角牛网络监控机的功能有哪些?天津职业大学地址天津职业大学,怎么样,多少分能进去。cmnet设置怎样把手机上网切入点设置为cmnet超声波探测超声波检测的原理wap地带APN,CMNET,CMWAP代表什么?艾上ai一次性口罩上的ai是什么意思?
qq域名邮箱 老域名全部失效请记好新域名 css样式大全 tightvnc 搜狗12306抢票助手 web服务器架设软件 panel1 php空间申请 刀片服务器是什么 共享主机 服务器是干什么的 isp服务商 qq云端 全能空间 网站加速 97rb rewritecond 数据湾 葫芦机 websitepanel 更多