java内部类,本是非常基础的,在分析一些开源框架源码时候或者看jdk源码的时候,就会发现用到大量的内部类。但是在实际工作中,尤其对于新手来说,根本不知道内部类有什么用处。说白了还是对内部类的基本原理不够清晰,没有掌握好这个基础,所以才不知道内部类有什么用处。
本人也是一边总结基础一边学习一边成长中。
关于内部类:
java有四种内部类:
①静态内部类(static inner class)
②成员内部类(member inner class)
③局部内部类(local inner class)
④匿名内部类(anonymous innter class)
本篇博客也是参考了好心网友的分享,不敢独享,网址链接如下:
java内部类(百度百科,比较简单,对于概念讲的比较多)
java中的内部类总结(本篇博客总结的非常不错,而且有比喻说明,理解很清晰透彻)
Java内部类的使用小结(本篇博客讲的原理很专业,非常值得一看的博文)
一、内部类是什么
1、概念:内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。说白了其实也就是一个类中还包含着另外一个类。
2、特点:
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
(4)、*内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
二、为什么需要用内部类
从理论上来说,无非是体现面向对象的几个特性,封装继承多态。说的实际点,就是省事。比如你需要定义一个类来实现一些功能,两个类之间就会有关联关系或者依赖关系,而这个新定义的类在别的地方又毫无作用。此时用内部类就最好不过了。这样既体现了面向对象的原则:职责单一原则、封装原则等,而且还可以通过内部类的方式实现多继承等。
举个简单的例子,就是在处理json数据的时候,我们都知道,对于json数据来说,一个{}就可以对应java类的一个类。而对于json数据里面的{}对应的java对象,对于整个程序而言是可以不对外的,那么此时我们就用内部类来实现即可。
代码举例(json,对应java类):
{
"user": {
"name": "zhangsan",
"gender": "man",
"age": 21
},
"data": {
"school": "xiaoxue",
"address": "jiaxiang"
}
}
/**
* author Ding Chengyun
* 2014-6-22
*/
package com.dcy;
/**
* @author Ding Chengyun
* 2014-6-22
*/
public class User {
private String name;
private String gender;
private int age;
private Data data;
public class Data {
private String school;
private String address;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
}
三、内部类如何使用
上面提到的网址链接里面以及代码里面都是例子。下面,是一个匿名内部类的使用例子:
关于匿名内部类:该类一定是继承了某个父类或者实现了某个接口,用的比较多的是事件监听。
/**
* author Ding Chengyun
* 2014-2-28
*/
package test;
import java.util.Date;
/**
* @author Ding Chengyun
* 2014-2-28
*/
public class AnonymousInnerClassTest {
@SuppressWarnings("deprecation")
public String get(Date date) {
return date.toLocaleString();
}
public static void test1() {
AnonymousInnerClassTest ac = new AnonymousInnerClassTest();
String result = ac.get(new Date() {});
//这里定义了一个匿名内部类,且该内部类还继承了Date类,
//当调用ac.get()方法的时候传的参数不是new Date()对象
//而是继承了Date类的这个匿名类
System.out.println(result);
}
public static void test2() {
AnonymousInnerClassTest ac = new AnonymousInnerClassTest();
String result = ac.get(new Date() {
public String toLocaleString() {
return "Hello world";
}
});
//这里定义了一个匿名内部类,且该内部类还继承了Date类,
//当调用ac.get()方法的时候传的参数不是new Date()对象
//而是继承了Date类的这个匿名类
System.out.println(result);
}
/**
* @param args
*/
public static void main(String[] args) {
test2();
}
}