`
jzming2010
  • 浏览: 1520 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

初探java内部类

阅读更多
【转载】http://hi.baidu.com/honglin_bd/blog/item/fa60c4d3866f972933fa1c87.html
1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
几种内部类的共性:
A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
2、成员内部类:形式如下
    class Outer {
        class Inner{}
    }      
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
3、方法内部类。
顾名思义,把类放在方法内。
    class Outer {
        public void doSomething(){
            class Inner{
                public void seeOuter(){
                }
            }   
        }
    }
A、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
B、方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
下面是完整的例子:
    class Outer {
        public void doSomething(){
            final int a =10;
            class Inner{
                public void seeOuter(){
                    System.out.println(a);
                }
            }  
            Inner in = new Inner();
            in.seeOuter();
        }
        public static void main(String[] args) {
            Outer out = new Outer();
            out.doSomething();
        }
     }
4、匿名内部类。
顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。
A、继承式的匿名内部类。
    class Car {
        public void drive(){
            System.out.println("Driving a car!");
        }
    }
   
    class Test{
        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){}
}

interface Foo{
    void foo();
}

class Test{
    static void go(){
        Bar b = new Bar();
        b.doStuff(new Foo(){
            public void foo(){
                System.out.println("foofy");
            }
        });
    }
}
5、静态嵌套类。
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
分享到:
评论

相关推荐

    初探spring aop内部实现 java

    而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的实现。在Spring中,DataSource是用于存储和管理数据库连接的...

    JAVA学习手册CHM版

    全书共20章,分为4篇进行介绍,第1篇为基础篇,包括Java开发前奏、搭建Java开发环境、 扎实Java语言基本语法、掌握算法和流程控制、使用Eclipse开发工具、探秘面向对象程序设计、初探Java数组;第2篇为核心篇,包括...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    Java中的指针与引用初探.pdf

    受限指针在Java中指的是Java的内部机制,如本地方法接口(JNI)中使用的指针,这些指针受到严格的限制,避免了指针操作带来的安全隐患。本地方法接口允许Java代码调用C或C++的库,这时需要使用到指针,但这些指针的...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    Java Applet内嵌网页运行初探 (1).pdf

    对于音乐播放,可以创建一个链接到音乐文件的超链接,或者在Applet内部实现音乐的加载和播放逻辑。然而,需要注意的是,由于安全性和现代浏览器的限制,Java Applet的使用已经逐渐减少,许多现代浏览器默认不再支持...

    Head First Java Second Edition 英文版

    同时,“入门书籍”强调了该书是针对那些希望初探Java编程世界的读者。 从提供的【部分内容】来看,这些文字是扫描过程中由于OCR技术限制而出现识别错误和遗漏的文本。尽管如此,我们还是能够从中解读出一些关于...

    Java完美编程(第3版).pdf

    本书是为全英文版本。 ...第13章 借口和内部类 第14章 泛型和arraylist类 第15章 链式数据结构 第16章 稽核,映射和迭代器 第17章 初探swing  第18章 深入swing 第19章 java的发展永无止境

    JDBC的事务初探

    **JDBC事务初探** Java Database Connectivity(JDBC)是Java平台中用于与关系数据库进行交互的API。在处理数据库操作时,事务管理是至关重要的一个环节,它确保了数据的一致性和完整性。本篇文章将深入探讨JDBC中...

    JSF初探(PDF)

    数据转换则是将用户输入的数据转换为应用程序内部使用的格式。 **七、国际化和本地化** JSF支持多语言应用,通过资源包(Resource Bundle)来实现。开发者可以创建不同语言版本的资源包,JSF会根据用户的区域设置...

    GWT通信机制初探

    标题 "GWT通信机制初探" 指的是探讨Google Web Toolkit (GWT) 的通信方式,这是一种用于构建高性能、跨浏览器的JavaScript应用程序的开发框架。GWT允许开发者使用Java语言编写前端代码,并自动编译成优化过的...

    java简单游戏 坦克大战

    《Java实现:坦克大战——初探游戏编程与技术要点》 在编程的世界里,游戏开发是一种极具挑战性和趣味性的实践。对于初学者来说,通过编写简单的游戏,如“坦克大战”,可以快速掌握基础编程概念,并逐步提升到更...

    Java ee 企业应用开发:第7章 在Spring中管理事务.ppt

    代理类内部调用目标类的方法,同时添加额外的行为,如日志记录。这种方法灵活性较低,因为每个新的服务都需要创建新的代理类。 2. **动态代理**:在运行时动态创建代理,无需预先知道目标类的具体实现。Java中的`...

    selenium+junit+hudson自动化测试初探

    【Selenium自动化测试初探】 本文旨在探讨如何利用Selenium、JUnit和Hudson构建一个自动化测试框架。Selenium是一款强大的开源Web功能测试工具,支持多种编程语言,如Ruby、Python、Java、Perl和C#。它能直接在...

    HelloWorld的javap -verbose HelloWorld 字节码初探

    `javap`是Java Platform Debugger Architecture的一部分,它能帮助开发者查看Java类文件的编译后细节,包括字节码、常量池、局部变量表等信息。 在描述中提到的链接是一个博客文章,可能详细解释了如何使用`javap -...

    Vertx-Web初探

    ### Vertx-Web初探 #### 一、项目概述与准备 ##### 1.1 基本项目结构 为了确保项目的顺利进行,首先需要创建一个Maven项目,并且按照以下结构组织: - 源代码包:`src/main/vertx` - 资源路径:`src/main/...

    bbosspersistent 性能初探

    《bbosspersistent性能初探》 在深入探讨bbosspersistent的性能之前,我们首先需要理解这个框架的核心概念和用途。bbosspersistent是一个基于Java的持久化框架,它提供了一种高效、灵活的方式来管理和操作数据库。...

    APP架构之后端接口设计方案之初探.pdf

    ### APP架构之后端接口设计方案之初探 #### 一、设计思想 在移动应用(APP)的开发过程中,后端接口的设计尤为关键。为了确保良好的用户体验,必须遵循一系列的设计原则和技术规范。首先,考虑到移动网络环境的局限...

Global site tag (gtag.js) - Google Analytics