博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
匿名内部类的讲解
阅读量:2826 次
发布时间:2019-05-14

本文共 1700 字,大约阅读时间需要 5 分钟。

转载自:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
abstract 
class 
Person {
    
public 
abstract 
void 
eat();
}
 
class 
Child 
extends 
Person {
    
public 
void 
eat() {
        
System.out.println(
"eat something"
);
    
}
}
 
public 
class 
Demo {
    
public 
static 
void 
main(String[] args) {
        
Person p = 
new 
Child();
        
p.eat();
    
}
}

运行结果:eat something

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract 
class 
Person {
    
public 
abstract 
void 
eat();
}
 
public 
class 
Demo {
    
public 
static 
void 
main(String[] args) {
        
Person p = 
new 
Person() {
            
public 
void 
eat() {
                
System.out.println(
"eat something"
);
            
}
        
};
        
p.eat();
    
}
}

运行结果:eat something

可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

并且,匿名内部类还能用于接口上

 

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

interface 
Person {
    
public 
void 
eat();
}
 
public 
class 
Demo {
    
public 
static 
void 
main(String[] args) {
        
Person p =
new 
Person() {
            
public 
void 
eat() {
                
System.out.println(
"eat something"
);
            
}
        
};
        
p.eat();
    
}
}

运行结果:eat something

 

由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承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接口的匿名内部类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
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

你可能感兴趣的文章
使用pip离线安装ansible
查看>>
linux中redis安装部署及测试(单机版)
查看>>
关于google深度学习框架中PTB数据的batch方法中参数的理解
查看>>
spring mvc中集成redis(集群含密码、moven项目)
查看>>
ElasticSearch7 修改数据
查看>>
Elasticsearch7 检索API
查看>>
Elasticsearch7中的mapping设置以及变化
查看>>
Pycharm安装配置Anaconda和Pip遇到的问题和解决办法
查看>>
Lua Base64自定义编解码
查看>>
Xlua开发笔记:计时器
查看>>
Xlua开发笔记:网络图片加载
查看>>
C++初学者该如何写程序?
查看>>
C++桌面显示恶搞
查看>>
C++宏的黑科技用法《结构体字节序自动转换》
查看>>
C++与Lua闭包
查看>>
作为C++程序员怎么能不会这些技巧?
查看>>
Mysql远端数据导入到本地数据库
查看>>
Mac安装Homebrew错误历险
查看>>
Mysql对于Innodb关于ORDER BY使用索引的性能问题
查看>>
大小端字节序与序列化
查看>>