首页 > 其他 > 详细

java中的内部类

时间:2014-02-24 17:53:45      阅读:261      评论:0      收藏:0      [点我收藏+]

java中很重要的一个知识点是内部类,经常会用到,参考百度百科整理如下:

内部类分为:成员内部类、静态内部类、方法内部类、匿名内部类。

内部类的特点:

1、内部类任然是一个独立的类,编译后内部类会被编译成独立的.class文件,前面冠以外部类名和$符号;
2、内部类是外部类的一个成员,因此可以自由地访问外部类的成员变量,无论是否是private类型的;
3、内部类声明为静态的,就不能随便访问外部类的成员变量了,只能访问外部类的静态成员变量。

一、成员内部类

1、内部类一般形式

bubuko.com,布布扣
public class Out {

    private int age = 18;

    public class In {
        public void printAge() {
            System.out.println(age);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Out.In in = new Out().new In();
        in.printAge();
        /*下面写法也可以
        Out out=new Out();
        Out.In in=out.new In();
        in.printAge();
        */
    }

}
bubuko.com,布布扣

上面程序输出结果:18

说明内部类可以访问外部类的private类型变量;两种实例化内部类的方式,而且实例化内部类之前需要创建外部类对象;查看编译后的.class文件,发现有两个,Out.class和Out$In.class。

2、同名变量的作用域

bubuko.com,布布扣
public class Out {

    private int age = 18;

    public class In {
        private int age = 19;

        public void printAge() {
            int age = 20;
            System.out.println("局部变量:" + age);
            System.out.println("内部类变量:" + this.age);
            System.out.println("外部类变量:" + Out.this.age);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Out.In in = new Out().new In();
        in.printAge();
        /*
         * 下面写法也可以 Out out=new Out(); Out.In in=out.new In(); in.printAge();
         */
    }

}
bubuko.com,布布扣

局部变量、内部类变量和外部类变量同名的话会覆盖掉,调用内部和外部类变量时要用this.属性名和Out.this.属性名。

3、私有内部类

bubuko.com,布布扣
public class Out {

    private int age = 18;

    private class In {
        public void printAge() {
            System.out.println(age);
        }
    }

    public void outPrint() {
        new In().printAge();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // Out out = new Out();
        // out.outPrint();
        Out.In in = new Out().new In();
        in.printAge();
    }

}
bubuko.com,布布扣

程序输出:18

暂时不明白私有内部类竟然可以实例化,并且直接调用它的方法。

二、静态内部类

bubuko.com,布布扣
public class Out {

    private static int age = 18;

    static class In {
        public void printAge() {
            System.out.println(age);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // Out out = new Out();
        // out.outPrint();
        Out.In in = new Out.In();
        in.printAge();
    }

}
bubuko.com,布布扣

静态内部类只能访问外部类的静态变量,而且可以不用实例化外部类就可以创建外部类的对象。

三、方法内部类

bubuko.com,布布扣
public class Out {

    private int age = 18;

    public void print() {
        final int a = 12;// 方法内部类只能访问方法中的final类型变量
        class In {
            public void printAge() {
                System.out.println(a);
                System.out.println(age);
            }
        }
        new In().printAge();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Out out = new Out();
        out.print();
    }

}
bubuko.com,布布扣

因为方法的局部变量位于栈上,只存在于函数的生命周期中,内部类位于堆上,它们的生命周期不一样,所以方法内部类不能访问方法中的非final类型变量。

四、匿名内部类

顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。
匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例 。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、静态方法。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
A、继承式的匿名内部类
public class Car {
public void drive(){
System.out.println("Driving a car!");
}
public static void main(String[] args) {
Car car = new Car(){
public void drive() {
System.out.println("Driving another car!");
}
};
car.drive();
}
}
结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
B、接口式的匿名内部类。
interface Vehicle {
public void drive();
}
class Test{
public static void main(String[] args) {
Vehicle v = new Vehicle(){
public void drive(){
System.out.println("Driving a car!");
}
};
v.drive();
}
}
上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
C、参数式的匿名内部类。
class Bar{
void doStuff(Foo f){
f.foo();
}
}
interface Foo{
void foo();
}
class Test{
static void go(){
Bar b = new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println("foofy");
}
});
}
}

java中的内部类

原文:http://www.cnblogs.com/nannanITeye/p/3562456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!