`
ostar005
  • 浏览: 410 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java 学习笔记-内部类

阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

       首先什么是内部类(Oracle网站上称之为Nested class.)?

       所谓Java内部类即在另一个类的内部定义的类(declared within another class), 内部类分为静态内部类(static nested class )和非静态内部类(non-static nested class)。很容易理解不须代码示例。

       静态内部类:行为上静态内部类等同于外部类(another top-level class),因此static nested class不能直接访问outer class 实例的变量和方法,但可以访问 outer class 的静态变量和方法。此外static nested class可以直接通过outer class 的类名访问,如:OuterClass.StaticNestedClass. 代码示例

public class StaticNestedClassExample {

    /*
     * an instance variable
     */
    private String outerString;

    /*
     * a class variable
     */
    private static String outerStaicString;

    /*
     * an instance method
     */
    public String outerMethod() {
        return "";
    }

    /*
     * a class method
     */
    public static String outerStaticMethod() {
        return "";
    }

    /*
     * static nested class
     */
    public static class StaticNestedClass {

        private String innerString;

        private static String innerStaticString;

        public void innerMethod() {
            this.innerString = outerString;// Compiling error. can not refer directly to outer class instance variables
                                           // and methods
            outerMethod();// Compiling error. can not refer directly to outer class instance variables and methods

            this.innerString = outerStaicString;// OK
            outerStaticMethod();// OK

            StaticNestedClass outerClass = new StaticNestedClass();
            outerClass.outerMethod();// outerMethod can be accessed by an OuterClass instance.
            innerStaticString = outerClass.outerString;// outerString can be accessed by an OuterClass instance.
        }

        public static void innerStaticMethod() {
            innerStaticString = outString; // Compiling error.
            innerStaticString = outerStaicString;// OK
            outerMethod();// Compiling error.
            outerStaticMethod();// OK

            StaticNestedClass outerClass = new StaticNestedClass();
            outerClass.outerMethod();// outerMethod can be accessed by an OuterClass instance.
            innerStaticString = outerClass.outerString;// outerString can be accessed by an OuterClass instance.
        }
    }

    public static void main(String... args) {
        StaticNestedClass nestObject2 = new StaticNestedClass();
        StaticNestedClass nestObject1 = new StaticNestedClassExample.StaticNestedClass();
    }
}

 

        接下来描述一下对非静态内部类non-static nested class的理解,常用的non-static nested class,我把它分为三种:General,Local,Asynomous.

       General的内部类也就是在top-level 的类中定义另一个类,类似与成员变量。

       Local 的内部类通常是在top-level 的方法中定义一个类,当然这个类是有名字的,而且不能用public来修饰。

       而Aysnomous内部类与Local唯一不同的就是没有名字,匿名类常用于实现接口。 

    看代码:

package nested.classes.inner;

import java.util.List;

public class InnerClassExample {

    public class GneralInnerClass { // General

    }

    public void outerMethod() {
        class LocalInnerClass { // Local

        }
    }

    public void outerMethod2() {// Anonymous
        new Runnable() {
            @Override
            public void run() {
            }
        };
    }
}

 

 以上是理解内部类定义以及相关概念的描述。

        接下来,我们为什么要用内部类呢?

        为什么使用内部类呢,个人还真不能说个一青二白,如果真要说,我认为主要是用来对类的封装使用以及逻辑上的组装,另外就是可以让代码易读易维护,还有在CSDN 看到说使用内部类可以实现所谓的多继承http://blog.csdn.net/yu422560654/article/details/7466260,也就是说outer class已经继承了一个类如果想在这个outer class A中继承或使用另一个outer class B 的方法,可以在这个outer class A里面实现一个内部类来继承outer class B。举几个之所以使用内部类原因的例子来帮助理解吧:

 

 


/*
 * Why use nested classes?
 * There are several compelling reasons for using nested classes,among them:
 * 
 * 1. It is a way of logically grouping classes that only used in one place;
 *    If a class is useful to only one other class, then it is logical to embed *  it in that class and keep the two together. Nesting such "helper classes"  
 *   makes their  package more streamlined. 
*/
public class LogicalGrouping {

    public static void validatePhoneNumber(String number) {

        class PhoneNumber {
            private String formattedPhoneNumber = null;

            static final int standardLength = 11;

            final static String regularExpression = "[^0-9]";

            PhoneNumber(String number) {
                String currentNumber = number.replaceAll(regularExpression, "");
                if (currentNumber.length() == standardLength) {
                    formattedPhoneNumber = currentNumber;
                } else {
                    formattedPhoneNumber = null;
                }
            }
            public String getNumber() {
                return formattedPhoneNumber;
            }
        }
        if (null == new PhoneNumber(number).getNumber()) {
            System.out.println("Invalid Number");
        } else {
            System.out.println("OK.");
        }
    }
    public static void main(String[] args) {
        validatePhoneNumber("1810-1109-123");
    }
}

 在这个例子中,假设有个一个utility class 其中有个校验手机号的方法,而且这个类中的PhoneNumber 类只对这个utility class 有用,所以我们就用内部类的形式把这个校验逻辑写在一起,可以这样理解吧?再来一段代码:

 

 

/**
 * Why use nested classes? There are several compelling reasons for using       * nested classes,among them:
 * 
 * 2.Increased encapsulation
 * 
 * Consider two top-level classes, A and B, where B needs access to members of  * A that would otherwise be declared
 * private. By hiding class B within class A, A's members can be declared       * private and B can access them. In addition, B
 * itself can be hidden from the outside world.
 */
public class CorruptOfficial {//贪官
    private String privateCoffer;//小金库
    private class Concubine {//情妇
        Concubine() {
            System.out.println(privateCoffer);
        }
    }
}

 这个例子可以说很形象,一个类A要访问另一类B的成员变量b,但是B的成员变量是不能让其他类访问的,所以只能声明为private,但是A需要访问,怎么办呢?把A声明称B的内部类。这样可以把类A隐藏起来。

例子中,贪官的小金库是不允许任何人访问的,但是贪官的小三可以,这种情况下只能把小三声明为贪官的内部类了,而且可以把小三隐藏的很好,不为公众所知!!

       关于使用内部类可以让代码易读以维护的例子就偷懒不写了。

Others

   1 静态内部类不能直接访问外部类的非静态成员变量或者方法,但是可以访问外部类的静态变量和方法

   2.非静态内部类不能声明静态的成员变量和方法,除了常量表达式。例如:

public class CorruptOfficial {
    private String privateCoffer;

    private class Concubine {
        static private String fighting;//compile error;
       final static private String finalFighting = "Fighting";//OK

       static void serve(){} //Compile error
        Concubine() {
            System.out.println(privateCoffer);
        }
    }
}

   3.如果需要访问外部类的实例成员变量和方法则将内部类声明为non-static,不需要则可以声明为static

 

   其实在工作中,内部类很少使用,至少我很少使用,只是稍微弄懂一下。

分享到:
评论

相关推荐

    java笔记.zip

    尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 ...

    Java学习笔记-超强笔记

    实例变量的作用域至少在本类内部,受访问控制符的限制。 在重合作用域,实例变量和局部变量允许有命名冲突,“局部优先”。 定义方法: 格式: [ 修饰符 ] 返回类型 方法名( 参数列表 ) [ throws ...

    java学习笔记-达内科技

    这份“java学习笔记-达内科技”涵盖了从基础到高级的Java编程知识,旨在帮助初学者和进阶者深入理解Java的核心概念和技术。 首先,Java概述部分会介绍Java的历史、特点以及开发环境的搭建,包括安装JDK(Java ...

    java学习笔记-----给java初学者

    Java学习笔记是专门为Java初学者设计的一套详尽的学习资源,旨在帮助新手快速掌握这门广泛使用的编程语言。这份笔记涵盖了从基础概念到高级特性的全面内容,是学习和复习Java知识的理想工具。 1. **Java简介** ...

    达内java学习笔记-总最全

    在Java中,面向对象编程(OOP)是核心概念,这在"达内java学习笔记-总最全"中得到了强调。面向对象的主要特点是将现实世界中的实体抽象为对象,这些对象包含了属性(描述对象的状态)和方法(描述对象的行为)。...

    Java基础内容-内部类学习笔记

    根据老师讲解写的笔记

    Java学习笔记-面向对象-001-面向对象概括

    同时,阅读优秀的Java学习笔记和参考书籍,参与在线社区和论坛讨论,都可以帮助你加快学习进度,提高编程技能。在Java的世界里,不断探索和实践,你将能够构建出高效、可靠的面向对象软件系统。

    java学习笔记(内部类)汇集

    ### Java学习笔记——内部类详解 #### 一、引言 Java中的内部类是一个非常有用但又容易让人感到困惑的概念。内部类本质上是在另一个类的内部定义的类,它可以访问外部类的所有成员变量和方法,甚至是私有成员。...

    Java 版设计模式学习笔记-java-design-patterns.zip

    这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...

    Java基础尚硅谷宋红康学习笔记

    内部类(包括成员内部类、局部内部类、匿名内部类)是Java特有的特性,允许在类内部定义其他类。 【Java高级】 Java高级部分涵盖了更复杂的特性和技术,包括: 1. **反射**:Java反射机制允许在运行时检查类的信息...

    java学习笔记--第二天(list去重问题)

    在Java学习过程中,第二天的主题可能涉及了数据结构和集合框架中的一个重要概念——列表(List)的去重问题。这里我们主要探讨如何在Java中处理List的重复元素,以及可能涉及到的相关技术。 首先,让我们理解列表去重...

    Java学习笔记——良葛格

    "Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...

    Java学习笔记-个人整理的

    {3.8}内部类}{77}{section.3.8} {4}Collection}{80}{chapter.4} {4.1}\ttfamily java.util.ArrayList}{80}{section.4.1} {4.2}\ttfamily java.util.LinkedList}{81}{section.4.2} {4.3}贪吃蛇案例}{82}{section...

    java笔记--

    Java编程语言是面向对象的、跨平台...这些只是Java编程中的一部分知识点,实际的Java学习过程中,还需要深入理解反射、注解、并发编程、JVM原理、设计模式等多个方面。不断实践和学习,才能成为一名优秀的Java开发者。

    Java学习笔记(必看经典).pdf

    本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...

    JAVA 笔记-------------------

    4. **内部类**:内部类是Java中的一种高级特性,它定义在一个类的内部。内部类可以分为成员内部类、局部内部类、匿名内部类和静态内部类。内部类可以访问外部类的所有成员,包括私有成员,这提供了一种强大的封装...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    瑜琅java学习笔记

    ### 瑜琅Java学习笔记概览 瑜琅的Java学习笔记涵盖了Java的基础概念与核心特性,从起源到高级特性均有涉及。以下是对该学习笔记各部分的深入解析: #### 1. Java起源 ##### 1.1 发展背景 - Java的诞生源于Sun ...

Global site tag (gtag.js) - Google Analytics