上一篇:内部类的“独立”-static内部类 | 带你学《Java面向对象编程》之八十四
【本节目标】
通过阅读本节内容,你将了解到内部类的其他定义方式,并掌握内部类的定义方法,学会在复杂的开发过程中以正确的方式定义内部类。
方法中定义内部类
内部类可以在任意的结构中进行定义,这就包括了:类中、方法中、代码块中,但是从实际的开发来讲在方法中定义内部类的形式较多。
范例:观察在方法中定义的内部类
class Outer {
private String msg = "www.mldn.cn" ;
public void fun(long time) {
class Inner { //内部类
public void print() {
System.out.println(Outer.this.msg) ;
System.out.println(time) ;
}
}
new Inner().print() ; //方法中直接实例化内部类对象
}
}
public class JavaDemo{
public static void main(String args[]) {
new Outer().fun(2390239023L) ;
}
}
执行结果:
www.mldn.cn
2390239023
此时在fun()方法内部提供有Inner内部类的定义,并且可以发现内部类可以直接访问外部类中的私有属性,也可以直接访问方法中的参数,但是对于方法中的参数直接访问是从JDK1.8开始支持的。而在JDK1.8之前,如果方法中定义的内部类要想访问方法中的参数,则参数前必须追加final。
范例:在JDK1.8以前的程序结构
class Outer {
private String msg = "www.mldn.cn" ;
public void fun(final long time) {
final String info = "我很好" ;
class Inner { //内部类
public void print() {
System.out.println(Outer.this.msg) ;
System.out.println(time) ;
System.out.println(info) ;
}
}
new Inner().print() ; //方法中直接实例化内部类对象
}
}
执行结果:
www.mldn.cn
2390239023
我很好
之所以取消这样的限制,主要是为了其扩展的函数式编程准备的功能。
匿名内部类
匿名内部类是一种简化的内部类的处理形式,其主要是在抽象类和接口的子类上使用的。
范例:观察一个基本的程序结构
interface IMessage {
public void send(String str) ;
}
class MessageImpl implements IMessage {
public void send(String str) {
System.out.println(str) ; //www.mldn.cn
}
}
public class JavaDemo{
public static void main(String args[]) {
IMessage msg = new MessageImpl() ;
msg.send("www.mldn.cn") ;
}
}
如果现在IMessage接口中的MessageImpl子类只使用唯一的一次,那么是否还有必要将其定义为单独的类,那么在这样的要求下就发现这个时候定义的子类是有些多余了,所以就可以利用匿名内部类的形式来解决此问题。
范例:使用匿名内部类
interface IMessage {
public void send(String str) ;
}
public class JavaDemo{
public static void main(String args[]) {
IMessage msg = new IMessage() { //匿名内部类
public void send(String str) {
System.out.println(str) ; //www.mldn.cn
}
} ;
msg.send("www.mldn.cn") ;
}
}
有些时候为了更加方便的体现出匿名内部类的使用,往往可以利用静态方法做一个内部的匿名内部类的实现。
范例:在接口中直接定义匿名内部类
interface IMessage {
public void send(String str) ;
public static IMessage getInstance() {
return new IMessage() {
public void send(String str) {
System.out.println(str) ; //www.mldn.cn
}
} ;
}
}
public class JavaDemo{
public static void main(String args[]) {
IMessage.getInstance.send("www.mldn.cn") ;
}
}
与内部类相比,匿名内部类只是一个没有名字的只能够使用一次的,并且结构固定的一个子类操作。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学
下一篇:教你利用Lambda将代码化繁为简 | 带你学《Java面向对象编程》之八十六
更多Java面向对象编程文章查看此处