阿里云【名师课堂】Java面向对象开发74:匿名内部类
引出问题
讲解匿名内部类之前。首先观察以下的一段程序:
interface IMessage {
public void print() ;
}
class MessageImpl implements IMessage {
public void print() {
System.out.println("hello world") ;
}
}
public class TestDemo {
public static void main(String args[]) {
IMessage msg = new MessageImpl() ;
method(msg) ;
}
public static void method(IMessage temp) { // 接口引用传递
temp.print() ;
}
}
上面是个很简单的程序,但是现在有问题出现:
- 如果说现在
MessageImpl
子类只使用了一次,还有必要将其定义为单独的一个类吗?- 很明显,这样定义是对资源的浪费。
接口使用匿名内部类
那么此时可以利用匿名内部类的概念解决这个问题。
- 把
class MessageImpl implements IMessage
删了就是匿名内部类,但是这样写程序难以理解。
范例:在接口中使用匿名内部类
interface IMessage {
public void print() ;
}
public class TestDemo {
public static void main(String args[]) {
IMessage msg = new MessageImpl() { // 定义匿名内部类
public void print() {
System.out.println("hello world") ;
}
} ;
method(msg) ;
}
public static void method(IMessage temp) { // 接口引用传递
temp.print() ;
}
}
抽象类使用匿名内部类
abstract class Message {
public void print() { // 抽象类中的普通方法调用抽象方法
System.out.println(this.getInfo()) ;
}
public abstract String getInfo() ;
}
public class TestDemo {
public static void main(String args[]) {
// 不可以直接method(new Message()),因为抽象方法没有被覆写
method(new Message() {
public String getInfo() { // 覆写抽象方法
return "hello world" ;
}
}) ;
}
public static void method(Message temp) {
temp.print() ;
}
}
普通类使用匿名内部类
class Message {
public void print() { // 抽象类中的普通方法调用抽象方法
System.out.println("abcdrug hijklsd") ;
}
}
public class TestDemo {
public static void main(String args[]) {
method(new Message() {
public void print() { // 子类覆写父类的print方法
System.out.println("hello world") ;
}
}) ;
}
public static void method(Message temp) {
temp.print() ;
}
}
虽然在普通类中也可以实现,但是实际上并没有意义。
- 经过抽象类和接口的学习我们知道,普通类尽量不要有子类去继承,能够继承的只是抽象类或接口。所以虽然可以在普通类上使用匿名内部类的形式来定义子类,但是从我们正常的开发逻辑上是错误的。
总结
匿名内部类非现阶段的重点,目前的要求是能看懂匿名内部类代码,不作为编程时的首选。
以后还会学习到匿名内部类。
目前还是不适应博客园的界面,等学成了再回归吧,对我来说当下还是csdn比较方便快捷:https://blog.csdn.net/weixin_43624945