内部类详解
1、定义
一个类的定义放在另一个类的内部,这个类就叫做内部类。
必须通过外围类First的对象first来创建一个内部类的对象
而且需要注意的是,在创建外围类对象之前,不可能创建内部类的对象(嵌套类除外)。
4、内部类与向上转型
将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。
此时,内部类是private的,可以它的外围类Painter以外,没人能访问。
这样,private内部类给累的设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并完全隐藏实现的细节。
5、方法内的类
可以在方法内创建一个类。
Ok,在这个例子中,可以为A的构造方法传入一个参数。在匿名内部类中,并没有使用到这个参数。
如果使用到了这个参数,那么这个参数就必须是final的。
如果不是final的,编译器就会提示出错。
另外,还可以在匿名内部类里定义属性
由于类是匿名的,自然没有构造器,如果想模仿构造器,可以采用实例初始化({})
匿名内部类通过实例初始化,可以达到类似构造器的效果~
另外可以通过匿名内部类来改造工厂方法。
在Implemention1和2中匿名内部类用在字段初始化地方。
这样定义的工厂方法,代码上看起来是不是优雅一些?
7、嵌套类
static的内部类就叫做嵌套类
前面提到了很多次,嵌套类是个例外
使用嵌套类时有两点需要注意:
a、创建嵌套类对象时,不需要外围类
b、在嵌套类中,不能像普通内部类一样访问外围类的非static成员
1、定义
一个类的定义放在另一个类的内部,这个类就叫做内部类。
public class First {
public class Contents{
public void f(){
System.out.println("In Class First's inner Class Contents method f()");
}
public void getStr(){
System.out.println("First.str="+str);
}
}
public static void main(String [] args){
First first = new First();
First.Contents contents = first.new Contents();
contents.f();
}
}
必须通过外围类First的对象first来创建一个内部类的对象
而且需要注意的是,在创建外围类对象之前,不可能创建内部类的对象(嵌套类除外)。
4、内部类与向上转型
将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。
public interface Shape {
public void paint();
}
public class Painter {
private class InnerShape implements Shape{
public void paint(){
System.out.println("painter paint() method");
}
}
public Shape getShape(){
return new InnerShape();
}
public static void main(String []args){
Painter painter = new Painter();
Shape shape = painter. getShape();
shape.paint();
}
}
此时,内部类是private的,可以它的外围类Painter以外,没人能访问。
这样,private内部类给累的设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并完全隐藏实现的细节。
5、方法内的类
可以在方法内创建一个类。
public class B {
public A getA(int num){
return new A(num){
};
}
}
public class A {
private int num;
public A(int num){
this.num = num;
}
public A(){
}
}
Ok,在这个例子中,可以为A的构造方法传入一个参数。在匿名内部类中,并没有使用到这个参数。
如果使用到了这个参数,那么这个参数就必须是final的。
public class B {
public A getA(final int num){
return new A(num){
public int getNum(){
return num;
}
};
}
}
public class A {
private int num;
public A(int num){
this.num = num;
}
public A(){
}
}
如果不是final的,编译器就会提示出错。
另外,还可以在匿名内部类里定义属性
由于类是匿名的,自然没有构造器,如果想模仿构造器,可以采用实例初始化({})
public A getA(){
return new A(){
int num = 0;
String str;
{
str = "javaeye";
System.out.println("hello robbin");
}
};
}
匿名内部类通过实例初始化,可以达到类似构造器的效果~
另外可以通过匿名内部类来改造工厂方法。
public interface Service {
public void method1();
}
public interface ServiceFactory {
Service getService();
}
public class Implemention1 implements Service{
public void method1(){
System.out.println("In Implemention1 method method1()");
}
public static ServiceFactory factory = new ServiceFactory(){
public Service getService(){
return new Implemention1();
}
};
}
public class Implemention2 implements Service {
public void method1(){
System.out.println("in Implemention2 method method1()");
}
public static ServiceFactory factory = new ServiceFactory(){
public Service getService(){
return new Implemention2();
}
};
}
public class Test {
public static void main(String []args){
service(Implemention1.factory);
service(Implemention2.factory);
ServiceFactory factory1 = Implemention1.factory;
Service service1 = factory1.getService();
service1.method1();
ServiceFactory factory2 = Implemention1.factory;
Service service2 = factory2.getService();
service2.method1();
}
}
在Implemention1和2中匿名内部类用在字段初始化地方。
这样定义的工厂方法,代码上看起来是不是优雅一些?

7、嵌套类
static的内部类就叫做嵌套类
前面提到了很多次,嵌套类是个例外
使用嵌套类时有两点需要注意:
a、创建嵌套类对象时,不需要外围类
b、在嵌套类中,不能像普通内部类一样访问外围类的非static成员