`
wanly3643
  • 浏览: 23543 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java语言基础:内部类(转载)

阅读更多
1.  普通内部类

    * 普通内部类的一个最简单的例子:
// 外部类
class OutterClass {
    // 内部类
    public class InnerClass {
        private int i = 0;
        public int getInt(){
            return i;
        }
    }
    public void proc(){
        InnerClass inClass = new InnerClass();
        System.out.println(inClass.getInt());
    }
}
 
public class Main {    
    public static void main(String[] args) {
        OutterClass outClass = new OutterClass();
        outClass.proc();
    }
}


外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:
// 外部类
class OutterClass {
    private int mOut = 10;
    // 内部类
    public class InnerClass {
        private int mIn = 0;
        public void printOutPrivate(){
            // 直接打印外部类的成员
            System.out.println(mOut);
        }
    }
    public void printInPrivate(){
        InnerClass inClass = new InnerClass();
        // 直接打印内部类的私有成员
        System.out.println(inClass.mIn);
    }
    public void printOutPrivate(){
        InnerClass inClass = new InnerClass();
        inClass.printOutPrivate();
    }
}
 
public class Main {    
    public static void main(String[] args) {
        OutterClass outClass = new OutterClass();
        outClass.printInPrivate();
        outClass.printOutPrivate();
    }
}


如果外部类的成员变量与内部类的成员变量名字相同,当内部类要访问外部类的该成员时,可以使用“OutClass.this.mem”来区分:
// 外部类
class OutterClass {
    private int mMem = 10;
    // 内部类
    public class InnerClass {
        private int mMem = 0;
        public void printOutPrivate(){
            // 直接打印外部类的成员
            System.out.println(OutterClass.this.mMem);
        }
    }


要创建普通内部类,必须先创建相应的外部类:
// 外部类
class OutterClass {
    private int mMem = 10;
    // 内部类
    public class InnerClass {
        private int mMem = 0;
        public void printOutPrivate(){
            // 直接打印外部类的成员
            System.out.println(OutterClass.this.mMem);
        }
    }
}
 
public class Main {    
    public static void main(String[] args) {
        OutterClass outClass = new OutterClass();
       OutterClass.InnerClass inClass = outClass.new InnerClass();
        inClass.printOutPrivate();
    }
}


也可以用下面的方式:
// 外部类
class OutterClass {
    private int mMem = 10;
    // 内部类
    public class InnerClass {
        private int mMem = 0;
        public void printOutPrivate(){
            // 直接打印外部类的成员
            System.out.println(OutterClass.this.mMem);
        }
    }
    public InnerClass newInnerClass() {
        return new InnerClass();
    }
}
 
public class Main {    
    public static void main(String[] args) {
        OutterClass outClass = new OutterClass();
       OutterClass.InnerClass inClass = outClass.newInnerClass();
        inClass.printOutPrivate();
    }
}


2.  静态内部类

    普通内部类前面加上static修饰符,就成为静态内部类,静态内部类类似于C++的嵌套类,与普通内部类相比有如下区别:

        *静态内部类没有指向外部类的引用,外部类对于它来说更像一个名字空间。
        *普通内部类不能有静态成员,静态方法,或另一个静态内部类;而静态内部类可以有这一切。
        *静态内部类可以直接创建,不必先创建外部类:
// 外部类
class OutterClass {
    private int mMem = 0;
    // 静态内部类
    static public class InnerClass {
        private int mMem = 0;
        public void printOutPrivate(){
            // 这是错误的
            // System.out.println(OutterClass.this.mMem);
        }
    }
    public void printInPrivate() {
        InnerClass inClass = new InnerClass();
        // 可以直接访问静态内部类的成员
        System.out.println(inClass.mMem);
    }
}
public class Main {    
    public static void main(String[] args) {
        // 直接创建静态内部类
        OutterClass.InnerClass inClass = new OutterClass.InnerClass();
        inClass.printOutPrivate();
    }
}


从上面描述可以看出,静态内部类与一般类没有太大区别,只不过它是放在一个类的里面,这个类相当于它的名字空间,可以防止命名冲突。

3.  局部内部类
Java可以把一个类定义在一个方法里面,甚至是一个{}块里面,它的作用域就在这个块里面:
// 外部类
class OutterClass {
    public void testLocalInner() {
        if (true)
        {
            class LocalInner {
                public void proc() {
                    System.out.println("hello");
                }
            }
            // 可以创建使用
            LocalInner localInner = new LocalInner();
            localInner.proc();
        }
        // 错误:超出类定义的作用域
        LocalInner localInner = new LocalInner();
        localInner.proc();
    }
}


局部内部类的一般用途是实现某个接口,并作为这个接口传出方法被使用:
// 接口
interface Talker {
    public void Talk();
}
 
// 外部类
class OutterClass {
    public Talker getTalker() {
        // 现实该接口的局部内部类
        class SomeTalker implements Talker {
            public void Talk() {
                System.out.println("hello");
            }
        }
        // 创建类实例并作为Talker返回
        SomeTalker talker = new SomeTalker();
        return talker;
    }
}


4.  匿名内部类
匿名内部类的语法如下:
new InterfaceName(){......}; 或 new SuperclassName(){......}; 


它被认为是InterfaceName的实现者,或是SuperclassName的继承类,匿名内部类没有构建函数,如果SuperclassName有带参数的构造函数,必须在创建匿名内部类时带上这些参数,下面是匿名内部类最常见的使用场合:
// 接口
interface Talker {
    public void Talk();
}
 
// 外部类
class OutterClass {
    public void Talk(Talker talker) {
        talker.Talk();
    }
}
 
public class Main {    
    public static void main(String[] args) {
        OutterClass outClass = new OutterClass();
        // 直接生成一个匿名内部类
        outClass.Talk(new Talker(){
            public void Talk() {
                System.out.println("hello");
            }
        });
    }
}


转载地址 : http://blog.csdn.net/linzhengqun/archive/2011/03/24/6275586.aspx
分享到:
评论

相关推荐

    (转载)文思创新 java开发工程师笔试题.doc

    【Java开发笔试题解析】 1. 死循环与条件判断: 在提供的代码段中,题目考察了死循环的识别。选项A中的循环会在变量i大于100时跳出...在面试或笔试中,掌握这些知识将有助于展示候选人的编程技能和对Java语言的理解。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    利用 Java 实现组合式解析器,基于 Java 的界面布局 DSL 的设计与实现(转载)

    5. **Java 内部 DSL**:如何利用 Java 的类、接口和方法来构造内部DSL,让代码更易读、易维护。 6. **解析库的使用**:如ANTLR、JavaCC等解析库的工作原理和使用方法,以及它们如何简化解析器的开发。 7. **界面...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    骆昊JAVA面试题全集2018博客文章整理

    这些面试题涵盖了Java语言的基础和高级概念,是准备Java面试者不可或缺的学习资源。骆昊的修订和更新反映了他对Java技术的深入理解和持续关注,确保了这些面试题集的实用性和准确性。对于Java开发者而言,熟悉并掌握...

    Java面试题

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、异常处理、IO流、网络编程、设计模式、JVM优化、数据库操作等。以下是一些Java面试中常被问到的知识点...

    深入分析 Java I/O 的工作机制(转载)

    Java I/O(输入/输出)系统是Java编程语言中用于处理数据流的重要组成部分,它允许程序与外部资源如文件、网络、硬件设备等进行交互。深入理解Java I/O的工作机制对于开发高效、可靠的系统至关重要。以下是对Java I/...

    Java23种设计模式

    8. 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 适用场景:当一个对象的行为取决于它的状态,并且必须在运行时刻根据状态改变它的行为时;当代码中存在大量的...

    Python(面向对象编程语言) v3.4.0.zip

    高层语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。 可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工 作在不同...

    Java面试突击-V3.0.pdf

    从给定文件《Java面试突击-V3.0.pdf》中我们可以提取出一系列关于Java面试准备和求职技巧的知识点。 首先,文档强调了面试前的准备工作对于求职成功的重要性。面试并不仅仅是对个人技术能力的考验,还涉及到心态、...

    Derby 命令(转载)

    要启动`ij`,你需要在命令行中运行Java,将Derby的`lib`目录包含在类路径中,并指定`org.apache.derby.tools.ij`为主类。例如: ``` java -cp $DERBY_HOME/lib/derbytools.jar org.apache.derby.tools.ij ``` 在`...

    [转载]hotspot源码(JDK7)

    《深入解析JDK7 Hotspot源码》 Hotspot是Oracle JDK中的一个关键...同时,这也为理解其他语言在JVM上的运行机制提供了基础。无论是Java开发人员还是性能调优专家,对Hotspot源码的探索都是提升专业技能的重要途径。

    软件测试基本方法(转载)

    1. Selenium:一个用于Web应用程序的自动化测试工具,支持多种浏览器和编程语言,如Java、Python、C#等。 2. Appium:针对移动应用的自动化测试框架,支持iOS和Android平台,同样支持多种编程语言。 3. JMeter:...

    二十三种设计模式【PDF版】

    和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的 Java 语言基础上跃进一步,更重要的是,GoF 的设计模式反复 向你强调一个宗旨:要让你的程序尽可能的可重用。 这其实在向一个极限挑战:软件需求变幻...

    webwork教程(经典)

    WebWork是一款基于Java的MVC(模型-视图-控制器)框架,它在Web应用程序开发中提供了强大的功能和灵活性。本教程旨在帮助开发者理解和掌握WebWork的核心概念和技术。 **一、WebWork介绍** WebWork是由Apache软件...

    JBPM的开发指南,转载过来的

    工作项(Work Item)是JBPM对任务的内部表示,它们可以分配给特定的用户或角色。 ### 2. **JBPM的主要功能** #### 2.1 流程设计 使用JBPMSuite中的Process Modeler,开发者可以创建和编辑BPMN流程图,包括任务、...

    安卓航班Android开发经典教程大总结----序言.pdf

    相比于iOS使用的Objective-C,Android基于Java语言,使得更多开发者能够快速上手。这不仅促进了Android生态的繁荣,也为开发者提供了广阔的发展空间。 ### 二、教程内容与结构 #### 开发知识区 - **Android开发...

Global site tag (gtag.js) - Google Analytics