成员内部类实现如下:
package innerClassDemo;
import innerClassDemo.Foo.Goo;
/** 成员内部类:
声明在类体中,不使用static,具有类的成员特征
也就是,必须有类的实例才能创建内部类实例。内部类实例
可以访问共享外部类的成员变量。很常用。
如:链表的节点就可以定义为内部类 */
public class InnerClassDemo {
public static void
main(String[] args) {
Foo f1 = new Foo();
Goo
g1=f1.new Goo();
Goo g2=f1.new
Goo();
System.out.println(g1.add() +
","+g2.add());
Foo f2 = new Foo();
Goo g3=f2.new
Goo();
Goo g4=f2.new Goo();
f2.a =
2;
System.out.println(g3.add() +
","+g4.add());
}
}
class Foo{
int a =
1;
/** 成员内部类 */
class
Goo{
public int
add(){
//corejava.day07.inn.Foo.this.a;
return
a+1;
}
}
}
局部内部类实现如下:
package innerClassDemo;
/**局部内部类:把类声明在方法中,就是局部内部类,作用域
类似局部变量。很少见。**/
public class LocalDemo {
public static void
main(String[] args) {
/** 局部内部类, 在方法中声明,
作用域仅限方法中有效
* 局部内部类可以访问 final 的局部变量
**/
final int
a=7;
class Foo{
public int
add(){
return
a+1;
}
}
System.out.println(a);
Foo
foo=new Foo();
System.out.println(foo.add());
}
}
静态内部类实现如下:
package innerClassDemo;
import innerClassDemo.Koo.Foo;
/**
**
静态内部类:使用static修饰,声明在类体中.
静态内部类中可以访问外部类的静态成员。**/
public class
StaticInnerClassDemo {
public static void main(String[] args)
{
Foo foo=new
Foo();
System.out.println(foo.add());
}
}
/**
静态内部类
* 静态内部类可以共享外部类的静态资源(属性/方法)
**/
class
Koo{
static int a=1;
int b=2;
static class
Foo{
int b=8;
public int
add(){
return
innerClassDemo.Koo.a+innerClassDemo.Koo.Foo.this.b;
}
}
}
匿名内部类实现如下:
package innerClassDemo;
import java.util.Arrays;
import java.util.Comparator;
/**
* 匿名内部类,匿名类:非常常见,可以写在任何地方,就像一般的语句。
语法更象是创建对象:
Date d = new Date(){};
匿名类是对原类的一个继承,同时创建了实例,{} 就是继承
以后的类体。类体中可使用所有类的语法。
匿名类不能写构造器。
匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现。**/
public class
AnnDemo {
public static void main(String[] args) {
Goo
goo=new Goo(){
public String
toString(){
return
"重写toString实现";
}
};
System.out.println(goo.toString());
System.out.println(goo.say());
Goo
goo2=new
Goo();
System.out.println(goo2.toString());
System.out.println(goo2.say());
Xoo
xoo=new Xoo(){
public int add()
{
// TODO Auto-generated method
stub
return
1+1;
}
};
System.out.println(xoo.add());
//匿名类实际应用案例:
自定义排序
String[] ary =
{"Andy","Tom","Jerry","Bob"};
final int dir = -1;
//排序方向
Arrays.sort(ary, new
Comparator<String>(){
public int
compare(String o1, String o2)
{
//new
StringBuilder(o1).reverse().toString().compareTo()
return dir * (o1.charAt(o1.length()-1)-
o2.charAt(o2.length()-1));
}
});
System.out.println(Arrays.toString(ary));
}
}
interface
Xoo{
int add();
}
class Goo{
public String
toString(){
return "toString实现";
}
public
String say(){
return "hello!";
}
}
注意:任何内部类都编译成独立的class文件,在打包上线的时候尤其要注意不要漏掉内部类的清单,一般以$分开的
最大的作用:封装!