`
haibin369
  • 浏览: 58507 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java中的内部类

    博客分类:
  • Java
阅读更多

将一个类的定义放在另一个类的定义内部,成为内部类。

一、各种形式的内部类及其基本使用

成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列的类。

class Outer{
    private int field = 1;
    private int anotherField = 2;

    //成员内部类
    public class Inner{
        private int field = 10;

        //成员内部类不能有静态变量与方法,否则出现编译错误:
        //  Inner classes cannot have static declarations
        //private static String staticField = "static";

        public void func(){
            //内部类拥有外部类的所有元素的访问权,
            //也可以用Outer.this访问外部类对象
            System.out.println("Inner field: " + field);
            System.out.println("Outer field: " + Outer.this.field);
            System.out.println("Outer anotherField: " + anotherField);
        }
    }
}

public class InnerClassTest {
    public static void main(String[] args) {
        Outer outer = new Outer();
        //需要通过外部类对象创建成员内部类对象
        Outer.Inner inner = outer.new Inner();
        inner.func();
    }
}

 输出

Inner field: 10
Outer field: 1
Outer anotherField: 2

 

静态内部类:定义在一个类内部的static的类。

class Outer{
    //静态内部类不能访问外部类的非静态成员
    private int field = 1;
    private static int STATIC_FIELD = 2;

    //静态内部类
    public static class Inner{
        private int field = 10;
        private static int STATIC_FIELD = 20;

        public void func(){
            System.out.println("Inner field: " + field);
            System.out.println("Inner static field: " + STATIC_FIELD);
            System.out.println("Outer static field: " + Outer.STATIC_FIELD);
        }
    }
}

public class InnerClassTest {
    public static void main(String[] args) {
        //直接使用new创建静态内部类
        Outer.Inner inner = new Outer.Inner();
        inner.func();
    }
}

 输出

Inner field: 10
Inner static field: 20
Outer static field: 2

 

 局部内部类:定义在方法或者某个作用域内的类。

interface Interface {
    public void func();
}

class Outer {
    public Interface getInner(int field) {
        //局部内部类
        class Inner implements Interface {
            private int field;

            public Inner(int field) {
                this.field = field;
            }

            @Override
            public void func() {
                System.out.println("Inner: " + field);
            }
        }

        return new Inner(field);
    }

    public void accessInner() {
        //不能在其作用域外访问局部内部类
        //编译错误:Cannot resolve symbol 'Inner'
        Inner inner = new Inner(1);
    }
}

public class InnerClassTest {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Interface inner = outer.getInner(3);
        inner.func();
    }
}

 

匿名内部类

abstract class AbstractClass {
    protected static int STATIC_FIELD;

    public AbstractClass(int field) {
        this.STATIC_FIELD = field;
    }

    public abstract void func();
}

class Outer {
    public AbstractClass getAnonymousClass(int field) {
        String localField = "localField";

        //创建并返回匿名内部类
        return new AbstractClass(field) {
            @Override
            public void func() {
                System.out.println(STATIC_FIELD);
                //如果在匿名内部类中要使用外部方法的局部变量或者参数变量,
                //则他们必须是final的,下面两句会产生编译错误:
                //Variable 'field' is accessed from within inner class.
                //Needs to be declared final.
                System.out.println(field);
                System.out.println(localField);
            }
        };
    }
}

public class InnerClassTest {
    public static void main(String[] args) {
        Outer outer = new Outer();
        AbstractClass anonymousClass = outer.getAnonymousClass(2);
        anonymousClass.func();
    }
}

 

二、继承内部类

class Outer {
    class Inner {
        private int field;

        public Inner(int field) {
            this.field = field;
        }
    }
}

class InheritInner extends Outer.Inner {
    // 继承成员内部类必须传入一个外部类对象并显式地初始化其外
    // 部类对象的引用,否则该类会出现编译错误:
    // No enclosing instance of type 'Outer' is in scope
    public InheritInner(Outer outer, int field) {
        outer.super(field);
    }
}

 

三、多态与内部类

class SuperOuter{
    class Inner{
        public void func(){
            System.out.println("SuperOuter.Inner");
        }
    }
}

class SubOuter extends SuperOuter{
    //内部类不具有多态性,因此这个内部类不会覆盖父类的同名内部类,
    //两个内部类是存在于不同命名空间的独立的类
    class Inner{
        public void func(){
            System.out.println("SubOuter.Inner");
        }
    }
}

public class InnerClassTest {
    public static void main(String[] args) {
        SuperOuter outer = new SubOuter();
        //下面这句会调用SuperOuter.Inner的方法
        outer.new Inner().func();
    }
}

 输出

SuperOuter.Inner

 

分享到:
评论

相关推荐

    Java中内部类的实例化

    Java 内部类 实例化 在Outer类的静态方法中实例化内部类 在同一个包的其它类中实例化Outer类中的内部类

    java中内部类的分类及用法.pdf

    java中内部类的分类及用法.pdf

    java中内部类的使用.doc

    java中内部类的使用.doc

    java中内部类的分类及用法

    在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部。

    java中内部类与外部类的学习资料.docx

    java中内部类与外部类的学习资料.docx

    讲述java中内部类的研究

    JAVA从JDK1.1开始引入了内部类,可以参见代码,感觉好处就是设计类的时候可以偷懒,呵呵。主要是可以引用类的内部其他元素,差不多是把这个内部类当成原类的元素。还有可以隐藏类的一些设计细节,好处还是很多的。

    java 匿名内部类的使用规范

    java 匿名内部类的使用规范 java 匿名内部类的使用规范 java 匿名内部类的使用规范

    14.java局部内部类(方法中类).zip

    14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14...

    Java 接口 内部类

    Java 接口 内部类Java 接口 内部类Java 接口 内部类

    16.java匿名内部类.zip

    16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名...

    java 局部内部类的使用规范

    java 局部内部类的使用规范 java 局部内部类的使用规范

    Java内部类(DOC)

    Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类

    Java4Android 35_内部类和匿名内部类

    主要讲述了JAVA中内部类和匿名内部类的相关问题。

    java 内部类应用

    java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用

    java 成员内部类的使用规范

    java 成员内部类的使用规范 java 成员内部类的使用规范

    15.java静态内部类(相当于外部类).zip

    15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部...

    浅谈Java内部类的四个应用场景

    Java内部类是Java言语的一个很重要的概念,《Java编程思想》花了很大的篇幅来讲述这个概念。但是我们在实践中很少用到它,虽然我们在很多时候会被动的使用到它,但它仍然像一个幕后英雄一样,不为我们所知,不为我们...

    java内部类详解

    java内部类详解

    12.java内部类.zip

    12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...

Global site tag (gtag.js) - Google Analytics