【java开发系列】—— 嵌套类与内部类
时间:2022-04-22
本文章向大家介绍【java开发系列】—— 嵌套类与内部类,主要内容包括静态嵌套类、成员内部类、局部内部类、匿名内部类、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法。
嵌套类与内部类的结构如下图
静态嵌套类
静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初始化,就可以通过类名,直接调用。
1 class out1{
2 private static String name = "xingoo";
3 static class info{
4 void print(){
5 System.out.println("name:"+name);
6 }
7 }
8 }
使用样例
package testClass;
class out1{
private static String name = "xingoo";
static class info{
void print(){
System.out.println("name:"+name);
}
}
}
class out2{
private static String name = "xingoo test 2";
static class info{
String name = "inner infomation!";
void printInner(){
System.out.println("name:"+name);
}
void printOuter(){
System.out.println("name:"+out2.name);
}
}
}
/**
* 静态嵌套类
* @author xingoo
*
*/
public class test1 {
public static void main(String[] args){
//创建对象时,以xxx.yyy这种格式创建
out1.info oi = new out1.info();
oi.print();
out2.info oi2 = new out2.info();
oi2.printInner();
oi2.printOuter();
}
}
成员内部类
成员内部类,即该类作为另一个类的成员,因此只有引用另一个类,才能创建这个类。
1 class outer{
2 private String name = "xingoo";
3 class inner{
4 void print(){
5 System.out.println(name);
6 }
7 }
8 }
通常也用于隐藏的实现某个接口,如下面所示,第一种是传统的实现方式,第二种是隐藏了实现接口的实现方式。
1 interface Printer{
2 void print(String name);
3 }
4 class outerImpl1 implements Printer{
5 @Override
6 public void print(String name) {
7 System.out.println(name);
8 }
9 }
10 class outerImpl2{
11 private class inner implements Printer{
12 @Override
13 public void print(String name) {
14 System.out.println(name);
15 }
16 }
17 public Printer getPrinter(){
18 return new inner();
19 }
20 }
使用样例
package testClass;
/**
* 简单测试成员内部类
* @author xingoo
*
*/
class outer{
private String name = "xingoo";
class inner{
void print(){
System.out.println(name);
}
}
}
interface Printer{
void print(String name);
}
class outerImpl1 implements Printer{
@Override
public void print(String name) {
System.out.println(name);
}
}
class outerImpl2{
private class inner implements Printer{
@Override
public void print(String name) {
System.out.println(name);
}
}
public Printer getPrinter(){
return new inner();
}
}
/**
* 成员内部类
* @author xingoo
*
*/
public class test2 {
public static void main(String[] args){
//创建一个外部类的对象,通过调用这个对象的new方法创建其内部类的对象
outer o = new outer();
outer.inner i = o.new inner();
i.print();
//内部类实现接口隐藏
Printer out1 = new outerImpl1();
out1.print("xingoo test1");
outerImpl1 out1trans = (outerImpl1)out1;//支持向下转换
Printer out2 = (new outerImpl2()).getPrinter();
out2.print("xingoo test2");
//无法向下转换,因为inner是private类型的,这样就实现了接口的隐藏
}
}
局部内部类
局部类的声明之作用与某个代码块内,因此如果某个声明的类仅仅被一段程序所使用,其他地方再也用不到,就可以用这种实现方式。·
1 interface Logger{
2 public void log(String message);
3 }
4 public class test3 {
5
6 String startTime = (new Date()).toString();
7 /**
8 * 局部内部类,从定义上来讲,不属于任何其他的类,因为是声明在这个类内部的。与匿名内部类不同的就是它有名字。
9 * @return
10 */
11 public Logger getLogger(){
12 //由于LoggerImpl只在 getLogger内部使用,因此把它定义在函数内部,相对来说更安全一些
13 class LoggerImpl implements Logger{
14 @Override
15 public void log(String message) {
16 System.out.println(startTime + ":" + message);
17 }
18 }
19 return new LoggerImpl();
20 }
21
22 public static void main(String[] args){
23 test3 test = new test3();
24 Logger logger = test.getLogger();
25 logger.log("hello xingoo!");
26 }
27 }
匿名内部类
在使用new创建对象时,直接在后面创建它的实现类。
1 abstract class Printable{
2 public void print(String name){
3
4 }
5 }
6 /**
7 * 就是跟在new创建对象之后,直接定义它的类实现
8 * @author Administrator
9 */
10 public class test4 {
11 public static void main(String[] args){
12 Printable printer = new Printable(){
13 public void print(String name){
14 System.out.println(name);
15 }
16 };//注意因为这其实是一个new语法,因此要加上分号;
17 printer.print("hello!xingoo!");
18 }
19 }
参考资料:《JAVA 7程序设计》
- 一则数据库无法重启的案例分析(r8笔记第96天)
- 最大公约数和最小公倍数及其应用(Go语言解法)
- JAVA private私有类的 默认构造函数 的生成过程
- 一次数据变更的审核过程(r8笔记第95天)
- JavaScript 学习一
- 与Ajax同样重要的jQuery(2)
- 寻找第K元素的八大算法、源码及拓展
- 索引优先队列-IndexedPrirotyQueue的原理及实现(源码)
- Java 集合系列02之 Collection架构
- 开发者需要掌握的JS事件
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
- 关于curl网站运维与开发的那些事
- 并查集Union-find及其在最小生成树中的应用
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释