博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java匿名内部类汇总
阅读量:6262 次
发布时间:2019-06-22

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

hot3.png

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

匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

 

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

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

转载于:https://my.oschina.net/zlp5201/blog/404186

你可能感兴趣的文章
java数组或集合返回空的问题
查看>>
【转】gc日志分析工具
查看>>
java多线程系列2-线程控制
查看>>
godep 包管理工具
查看>>
爬虫工程师要求
查看>>
Linux 远程查看tomcat控制台
查看>>
【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)...
查看>>
[转] “error LNK2019: 无法解析的外部符号”之分析
查看>>
演示-JQuery关系选择器
查看>>
微信支付接口之jsApiPay教程
查看>>
C#十种语法糖
查看>>
PHP 如何显示大数字,防止显示为 科学计数法 形式
查看>>
数据扩展性探讨和总结--转
查看>>
spider RPC高级特性
查看>>
C# 导出资源文件到硬盘
查看>>
修复 ThinkPHP3.2.3 抛出异常模块的一个BUG,关闭字段缓存功能
查看>>
更改MySQL数据库的编码为utf8mb4
查看>>
android自动化测试--appium运行的坑问题及解决方法
查看>>
mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
查看>>
TeamCity : .NET Core 插件
查看>>