匿名类~由一个貌似简单的java面试题所想到的···
原题如下:
public class Tex {
public static void main(String[] args) {
if(___________){
System.out.println("world");
}
else{
System.out.println("hello");
}
}
}
只能在if(_____)里面写代码,如何让输出结果是“hello world”?
答案有几种(当然还应该有别的吧),如下:
NO1:if(new Tex(){{System.out.print("hello ");}}!=null)
NO2:if (System.out.append("hello ") != null)
NO3:if(System.out.printf("hello ")!=null)
对于答案1,用的是匿名类。个人觉得匿名类在写程序时用的并不多,所以有时看见时觉得比较生僻,现整理如下:
一、匿名类的语法:
1、匿名类没有名字(废话)
2、不能给匿名类添加构造方法
3、匿名类无法显式的继承某个类或实现某个接口
4、匿名类没有任何修饰符
二、现在介绍匿名类的3中用法:
1:通过接口使用匿名类
(1)先定义一个接口:
public interface AnInterface {
public void method();
}
(2)下面是测试用Cilent:
public class Client {
public static void main(String[] args) {
AnInterface anonymous = new AnInterface() {
public void method() {
System.out.println("hello world!");
}
public void method2() {
System.out.println("hello world!");
}
};
anonymous.method();
}
}
(3)输出为:hello world!
(4)总结:一般new关键字后面应该跟一个类名的,但现在我们看到new后面紧接着跟了个接口名!但再看后面有{},可以认为它是匿名类的类体。因此,这个匿名类没有名字,但它实现了接口AnInterface,并且在自己的类体中实现了接口AnInterface中的抽象方法method,事实上此匿名类必须实现接口所有的抽象方法。
2:通过抽象类使用匿名类:
(1)先定义一个抽象类:
public abstract class AnAbstractClass {
public AnAbstractClass(){
System.out.println("AnAbstractClass");
}
public void method1(){
System.out.println("method1");
}
public abstract void method2();
}
(2)下面是测试用Cilent:
public class Client {
public static void main(String[] args) {
AnAbstractClass anonymous=new AnAbstractClass(){
@Override
public void method2() {
System.out.println("method2");
}
};
anonymous.method1();
anonymous.method2();
}
}
(3)输出为:AnAbstractClass
method1
method2
(4)总结:其实和通过接口使用匿名类用法很相似,核心就是:对于抽象方法在匿名类中必须给予实现,使抽象的抽象类或接口不再抽象,也就可以创建类的实例了。
另外如果抽象类的构造方法有参数的话那么匿名类也要加参数,即:
public AnAbstractClass(int n){
System.out.println("AnAbstractClass");
}
AnAbstractClass anonymous=new AnAbstractClass(1){};
3:通过类使用匿名类:
public class Tex {
public Tex(){
System.out.println("tex");
}
public static void main(String[] args) {
System.out.print("");
Tex t=new Tex(){{System.out.println("hello ");}};
Tex tt=new Tex();
System.out.print("");
}
}
输出为:
tex
hello
Tex
四: 总结:(只是个人猜想,不一定对)匿名类的构造原理:由以上的用法2和3的输出可以看出在new新的匿名类时总是先调用父类的构造方法,因此匿名类匿名类 的其实就是类继承的变种,只不过匿名类不能有构造方法,因此它不能像其他正常的类继承那样先调用父类的构造方法而后再调用自己的构造方法!因此匿名类通过 调用父类的构造方法进行构造。
但是当通过接口构造匿名类是我也不知道是怎么构造出这个匿名类来的。?
转载于:https://blog.51cto.com/4599751/1071510