美文网首页
匿名类浅析

匿名类浅析

作者: 时光机器01 | 来源:发表于2019-04-16 15:12 被阅读0次

匿名类是没有名字的类,正因为没有名字,所以通常只使用一次,一般用于简化代码。
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

除了只使用一次外,如果想使用一个类的protect方法,但是这个类不在同一个包下,这时匿名类就可以派上用场。你可以声明一个匿名类继承这个类,然后实现一个方法用super指向这个类的protect方法。这样大大简化了代码的复杂度。talk is cheap,下面通过代码show一下匿名类的优势

实例1:不使用匿名内部类来实现抽象方法

abstract class Message {
    public abstract void sendMsg();
}
 
class Phone extends Message {
    public void sendMsg() {
        System.out.println("hello every body");
    }
}
 
public class Demo {
    public static void main(String[] args) {
        Message m = new Phone();
        m.sendMsg();
    }

运行结果:hello every body
从例子中我们可以看到Phone继承了Message,然后实现了一个phone实例,将其向上转型为Message。如果Phone实例只使用一次这么实现是不是显得有点麻烦。
这个时候就可以使用匿名内部类

实例2:匿名内部类的基本实现

abstract class Message {
    public abstract void sendMsg();
}
 
public class Demo {
    public static void main(String[] args) {
        Message p = new Message() {
            public void sendMsg() {
                System.out.println("hello every body");
            }
        };
        p.sendMsg();
    }
}

运行结果:hello every body
可以看出直接将抽象类Message的方法在大括号中实现
直接省去了一个类的书写
匿名类除了能在内部类中实现继承的功能,同时也能实现一个接口的效果

实例3:在接口上使用匿名内部类

interface Message {
    public void sendMsg();
}
 
public class Demo {
    public static void main(String[] args) {
        sendMsg p = new sendMsg() {
            public void sendMsg() {
                System.out.println("hello every body");
            }
        };
        p.sendMsg();
    }
}

运行结果:hello every body
由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

实例4:Thread类的匿名内部类实现

public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        t.start();
    }
}

运行结果:1 2 3 4 5
实例5:Runnable接口的匿名内部类实现

public class Demo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
}

运行结果:1 2 3 4 5

相关文章

  • 匿名类浅析

    匿名类是没有名字的类,正因为没有名字,所以通常只使用一次,一般用于简化代码。但使用匿名内部类还有个前提条件:必须继...

  • Java-浅析Object类

    Java-浅析Object类 ++2016.7.19++byside @Java-浅析Object类 ======...

  • 匿名类

    匿名类: 匿名类,就是没有名称的类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也...

  • 匿名类

    一.匿名类 /* 抽象类的匿名子类 */public class PersonTest { } class Wor...

  • 匿名类

    匿名类是一种即时继承现有类的方法。 例如,下面有一个类 Computer: class Computer { p...

  • java - 学习笔记

    日期 匿名类 lambda stringBuffer stringBuilder 定时 日期 匿名类 lambda...

  • 每日一点(1)

    匿名类 内部类 匿名内部类 匿名类(可以是接口 抽象类 普通类):1:无需创建对象2:直接重写方法 内部类:若一...

  • lambda 和 匿名内部类的区别 this

    this关键字 匿名类匿名类的this关键字指向匿名类 lambda表达式lambda表达式的this关键字指向包...

  • 2021-12-23 Spring中的ObjectFactory

    查看ObjectFactory的层次关系,发现有好几个匿名类: 这种匿名类也是子类(实现类)。

  • 匿名类,匿名内部类

    首先我们来看一下内部类的定义: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外...

网友评论

      本文标题:匿名类浅析

      本文链接:https://www.haomeiwen.com/subject/tmzvwqtx.html