Java 内部类种类及使用解析

By | 03月29日
Advertisement

原文地址:http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html

Java 内部类种类及使用解析

内部类Inner Class

  将相关的类组织在一起,从而降低了命名空间的混乱。

  一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。

  Java中的内部类共分为四种

  静态内部类static inner class (also called nested class)

  成员内部类member inner class

  局部内部类local inner class

  匿名内部类anonymous inner class

静态内部类Static Inner Class

  最简单的内部类形式。

  类定义时加上static关键字。

  不能和外部类有相同的名字。

  被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。

  只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。

  生成静态内部类对象的方式为:

  OuterClass.InnerClass inner = new OuterClass.InnerClass();

  静态内部类使用代码:

Java 内部类种类及使用解析

Java 内部类种类及使用解析

package com.learnjava.innerclass;

class StaticInner
{
    private static int a = 4;

    // 静态内部类
    public static class Inner
    {
        public void test()
        {
            // 静态内部类可以访问外部类的静态成员
            // 并且它只能访问静态的
            System.out.println(a);
        }

    }
}

public class StaticInnerClassTest
{

    public static void main(String[] args)
    {
        StaticInner.Inner inner = new StaticInner.Inner();
        inner.test();
    }
}

Java 内部类种类及使用解析

成员内部类Member Inner Class

  成员内部类也是定义在另一个类中,但是定义时不用static修饰。

  成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。

  成员内部类就像一个实例变量。

  它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以

  在外部类里面创建成员内部类的实例:

  this.new Innerclass();

  在外部类之外创建内部类的实例:

  (new Outerclass()).new Innerclass();

  在内部类里访问外部类的成员:

  Outerclass.this.member

  详情见代码例子:

Java 内部类种类及使用解析

Java 内部类种类及使用解析

package com.learnjava.innerclass;

class MemberInner
{
    private int d = 1;
    private int a = 2;

    // 定义一个成员内部类
    public class Inner2
    {
        private int a = 8;

        public void doSomething()
        {
            // 直接访问外部类对象
            System.out.println(d);
            System.out.println(a);// 直接访问a,则访问的是内部类里的a

            // 如何访问到外部类里的a呢?
            System.out.println(MemberInner.this.a);
        }

    }

}

public class MemberInnerClassTest
{

    public static void main(String[] args)
    {

        // 创建成员内部类的对象
        // 需要先创建外部类的实例
        MemberInner.Inner2 inner = new MemberInner().new Inner2();

        inner.doSomething();
    }
}

Java 内部类种类及使用解析

局部内部类Local Inner Class

  局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。

  像局部变量一样,不能被public, protected, private和static修饰。

  只能访问方法中定义的final类型的局部变量。

  局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。

Java 内部类种类及使用解析

Java 内部类种类及使用解析

package com.learnjava.innerclass;

class LocalInner
{
    int a = 1;

    public void doSomething()
    {
        int b = 2;
        final int c = 3;
        // 定义一个局部内部类
        class Inner3
        {
            public void test()
            {
                System.out.println("Hello World");
                System.out.println(a);

                // 不可以访问非final的局部变量
                // error: Cannot refer to a non-final variable b inside an inner
                // class defined in a different method
                // System.out.println(b);

                // 可以访问final变量
                System.out.println(c);
            }
        }

        // 创建局部内部类的实例并调用方法
        new Inner3().test();
    }
}

public class LocalInnerClassTest
{
    public static void main(String[] args)
    {
        // 创建外部类对象
        LocalInner inner = new LocalInner();
        // 调用外部类的方法
        inner.doSomething();
    }

}

Java 内部类种类及使用解析

匿名内部类Anonymous Inner Class

  匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。

  匿名内部类隐式地继承了一个父类或者实现了一个接口

  匿名内部类使用得比较多,通常是作为一个方法参数。

Java 内部类种类及使用解析

Java 内部类种类及使用解析

package com.learnjava.innerclass;

import java.util.Date;

public class AnonymouseInnerClass
{

    @SuppressWarnings("deprecation")
    public String getDate(Date date)
    {
        return date.toLocaleString();

    }

    public static void main(String[] args)
    {
        AnonymouseInnerClass test = new AnonymouseInnerClass();

        // 打印日期:
        String str = test.getDate(new Date());
        System.out.println(str);
        System.out.println("----------------");

        // 使用匿名内部类
        String str2 = test.getDate(new Date()
        {
        });// 使用了花括号,但是不填入内容,执行结果和上面的完全一致
            // 生成了一个继承了Date类的子类的对象
        System.out.println(str2);
        System.out.println("----------------");

        // 使用匿名内部类,并且重写父类中的方法
        String str3 = test.getDate(new Date()
        {

            // 重写父类中的方法
            @Override
            @Deprecated
            public String toLocaleString()
            {
                return "Hello: " + super.toLocaleString();
            }

        });

        System.out.println(str3);
    }
}

Java 内部类种类及使用解析

  生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。

  Swing中使用内部类的例子如下:

Java 内部类种类及使用解析

Java 内部类种类及使用解析

package com.learnjava.innerclass;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SwingTest
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("JFrame");
        JButton button = new JButton("JButton");

        button.addActionListener(new ActionListener()
        {
            // new出来一个实现了ActionListener接口的类的实例

            @Override
            public void actionPerformed(ActionEvent arg0)
            {
                System.out.println("Hello World");

            }
        });

        //加入按钮
        frame.getContentPane().add(button);

        //设置关闭行为
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(200, 200);

        frame.addWindowListener(new WindowAdapter()
        {
            //也可以使用继承了适配器类的匿名内部类
            @Override
            public void windowClosing(WindowEvent e)
            {

                System.out.println("Closing");
                System.exit(0);
            }
        });
        frame.setVisible(true);
    }

}

Java 内部类种类及使用解析

Similar Posts:

  • Java内部类解析及其运用

    Java的语言特性相比c#来说少了很多,最明显的一个地方是java里没有函数指针这样的机制,而c#里有"委托"这个概念来充当函数指针的作用.那么java里用什么来实现类似c#里用函数指针完成的任务--比如委托事件这样的机制?其实java用的是普通的接口,而这里有一个概念起了很重要的作用,那就是内部类.本文就围绕java内部类,先介绍基本用法和编译器对内部类的解释.在以上两点的基础上理解java内部类如何在一些重要的编程场合发挥作用. 第一部分:基本用法 从语法层面上来看,内部类是作为拥

  • 使用java自带的xml解析器解析xml

    使用java自带的xml解析器解析xml, 其实我不推荐,可以用Dom解析,或其他的方式, 因为Java自带的解析器使用不但麻烦,且还有bug出现. 它要求,针对不同的xml(结构不同),必须写对应的handler处理类, 而Dom解析可以写通用的方法(前提是要写出通用逻辑)来处理,开发比较快. 下面上代码 1 //------------------ main point --------------------- 2 javax.xml.parsers.SAXParserFactory 3

  • [转载]Java中四种XML解析技术之不完全测试

    Java中四种XML解析技术之不完全测试 在平时工作中,难免会遇到把XML作为数据存储格式.面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历XML这块来测试,因为遍历XML是工作中使用最多的(至少我认为). 预备 测试环境: AMD毒龙1.4G OC 1.5G.256M DDR333.Windows2000 Server SP4.Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在Debug模式下测试. XML

  • Java内部类:局部内部类(三)

    Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节. 1.局部内部类的概念 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. class OutterClass { void test() { class InnerClass//局部内部类 { } } } 在上述代码中,InnerClass定义在OutterClass的test方法的内部

  • 浅析JAVA内部类

    例子: public class OuterClass{ private double d=1.0; //insert code here } 插入的代码如下所示: A.class InnerOne{ public static double methoda(){return d;} } B.public class InnerOne{ static double methoda(){return d;} } C.private class InnerOne{ double methoda(){

  • Java系统工具jps原理解析

    Java系统工具jps原理解析 简介 当我们需要获取当前正在运行的Java进程时,我们可以通过操作系统自带的工具来筛选,如ps和netstat等.不过Java也提供了通用的工具来实现该功能,而且能够提供更加详细的信息.jps是Java Virtual Machine Process Status Too的简称,可以用来获取当前用户系统中的Java进程. 使用 jps的命令格式为 jps [ options ] [ hostid ],具体形式如下: usage: jps [-help] jps [

  • java内部类_让你一看就明白_再也不用困惑

    在一篇blog:"java内部类的作用分析"中你可以了解java内部类的一些东西,不过内部类中还有一些地方值得我们细心研究... 下面是我总结出来的java内部类的一些东西,分享给大伙儿.... one:静态内部类可以有静态成员,而非静态内部类则不能有静态成员 怎样理解这个呢? 看看下面的代码: 1 /** 2 * 3 */ 4 package com.b510.test; 5 6 public class Test { 7 private int number = 1; 8 9 //

  • 【JAVA基础】JAVA 内部类

    定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.protected.private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static.final的,也可以实现特定的接口.static的内部类行为上象一个独立的类,非static在行为上类似类的属性或方法且禁止声明static的方法.内部类可以访问外部类的所有方法与属性,但static的内部类只能访问外部类的静态属性与方法. Java的设计者在内部类身上的确是专心良苦.

  • 转贴 - Java NIO类库Selector机制解析(下)

    http://blog.csdn.net/haoel/archive/2008/03/27/2224069.aspx Java NIO类库Selector机制解析(下) 赵锟 陈皓 http://blog.csdn.net/haoel <<<<点此查看本文上篇 五. 迷惑不解 : 为什么要自己消耗资源? 令人不解的是为什么我们的Java的New I/O要设计成这个样子?如果说老的I/O不能多路复用,如下图所示,要开N多的线程去挨个侦听每一个Channel (文件描述符) ,如果这样

  • Java内部类好文记录

    JAVA内部类文章,地址: http://blog.csdn.net/ilibaba/article/details/3866537 主要讲解了内部类的一些使用.

Tags: