<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学习笔记。 、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笔记 ...
实例变量的作用域至少在本类内部,受访问控制符的限制。 在重合作用域,实例变量和局部变量允许有命名冲突,“局部优先”。 定义方法: 格式: [ 修饰符 ] 返回类型 方法名( 参数列表 ) [ throws ...
这份“java学习笔记-达内科技”涵盖了从基础到高级的Java编程知识,旨在帮助初学者和进阶者深入理解Java的核心概念和技术。 首先,Java概述部分会介绍Java的历史、特点以及开发环境的搭建,包括安装JDK(Java ...
Java学习笔记是专门为Java初学者设计的一套详尽的学习资源,旨在帮助新手快速掌握这门广泛使用的编程语言。这份笔记涵盖了从基础概念到高级特性的全面内容,是学习和复习Java知识的理想工具。 1. **Java简介** ...
在Java中,面向对象编程(OOP)是核心概念,这在"达内java学习笔记-总最全"中得到了强调。面向对象的主要特点是将现实世界中的实体抽象为对象,这些对象包含了属性(描述对象的状态)和方法(描述对象的行为)。...
根据老师讲解写的笔记
同时,阅读优秀的Java学习笔记和参考书籍,参与在线社区和论坛讨论,都可以帮助你加快学习进度,提高编程技能。在Java的世界里,不断探索和实践,你将能够构建出高效、可靠的面向对象软件系统。
### Java学习笔记——内部类详解 #### 一、引言 Java中的内部类是一个非常有用但又容易让人感到困惑的概念。内部类本质上是在另一个类的内部定义的类,它可以访问外部类的所有成员变量和方法,甚至是私有成员。...
这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...
内部类(包括成员内部类、局部内部类、匿名内部类)是Java特有的特性,允许在类内部定义其他类。 【Java高级】 Java高级部分涵盖了更复杂的特性和技术,包括: 1. **反射**:Java反射机制允许在运行时检查类的信息...
在Java学习过程中,第二天的主题可能涉及了数据结构和集合框架中的一个重要概念——列表(List)的去重问题。这里我们主要探讨如何在Java中处理List的重复元素,以及可能涉及到的相关技术。 首先,让我们理解列表去重...
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是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学习过程中,还需要深入理解反射、注解、并发编程、JVM原理、设计模式等多个方面。不断实践和学习,才能成为一名优秀的Java开发者。
本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...
4. **内部类**:内部类是Java中的一种高级特性,它定义在一个类的内部。内部类可以分为成员内部类、局部内部类、匿名内部类和静态内部类。内部类可以访问外部类的所有成员,包括私有成员,这提供了一种强大的封装...
Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
### 瑜琅Java学习笔记概览 瑜琅的Java学习笔记涵盖了Java的基础概念与核心特性,从起源到高级特性均有涉及。以下是对该学习笔记各部分的深入解析: #### 1. Java起源 ##### 1.1 发展背景 - Java的诞生源于Sun ...