内部类
建议参考:http://www.cnblogs.com/dolphin0520/p/3811445.html
- 在一个外部类的内部再定义一个类。类名无需与文件夹相同。
- 内部类可用static,public,protected,private,default修饰
- 内部类的成员变量/方法名可以和外部类的相同
类别
- 成员内部类
- 局部内部类
- 匿名内部类
- 静态内部类
每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 内部类使得多继承的解决方案变得完整;方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏;方便编写事件驱动程序;方便编写线程代码
详解
成员内部类
- 不能含有static的变量和方法,因需先创建外部类对象,而后创建内部类对象。
- 使用outer.this来表示外部类对象
/**
* 成员内部类
* Outer.java
* @author xianggen
* @date 2016年7月24日 下午6:49:50
*/
package xianggen.innerclass;
public class Outer{
public static void main(String[] args) {
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.innerMethod();
System.out.println("通过new关键字产生内部类对象!");
inner=outer.getInner();
inner.innerMethod();
System.out.println("通过外部类的get方法得到内部类对象");
}
/**
* 通过get方法来获取成员内部类
* @return
*/
public Inner getInner(){
return new Inner();
}
public class Inner{
int innerData;
public void innerMethod(){
System.out.println("innerData="+innerData);
}
}
}
局部内部类
- 定义在方法或者作用域内(语句块)
- 不能加任何访问修饰符(public等及static),因为只对局部有效。可用final和abstract修饰。
- static方法中定义的内部类可以访问外部类定义的static成员。
package xianggen.innerclass;
/**
* 局部内部类
* LocalInnerClass.java
* @author xianggen
* @date 2016年7月24日 下午7:10:54
*/
public class LocalInnerClass {
private void internalTracking(boolean b) {
if (b) {
// 作用域里定义内部类
class TrackingSlip {
private String id;
TrackingSlip(String s) {
id = s;
}
String getSlip() {
return id;
}
}
TrackingSlip ts = new TrackingSlip("slip");
String s = ts.getSlip();
}
}
public static void main(String[] args) {
LocalInnerClass p = new LocalInnerClass();
p.internalTracking(true);
}
}
匿名内部类
- 没有名字。匿名内部类是唯一一种没有构造器的类
- 不能加访问修饰符
- 目的是创建一个类的实例,这个实例只用一次。即在定义类的同时就创建一个类的实例。
- 由于匿名内部类没有名称,所以类体中不能定义构造方法。不能使用关键字来创建该类的实例
//似乎有问题,编译不通过,想不通
public class AnonymousClass {
public void anonymousMethod(new Object(){
public void method(){
System.out.println("creating a anonymous class!");
}
});
}
静态内部类
声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。
一般声明为public,方便调用
枚举类
简介
JDK 1.5 中引入的新特性,存放在 java.lang 包
用法
1.定义常量
//定义常量
public enum EnumColor {
RED,GREEN,BLACK,YELLOW
}
2.switch跳转
//swich跳转!
enum Signal{
GREEN,YELLOW,RED
}
class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
更多用法参考:
http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html