内部类:将一个类定义在另一个类的内部。如果这个类是static类型的,我们通常称其为“嵌套类”。
我们首先说一下内部类:
①我们将类置于其他类的内部,可以很容易的实现代码隐藏。
②当我们建立内部类的对象时,这个对象就与制造它的外部对象建立了联系,即内部对象能够访问外围对象的所有成员。
③每个内部类都可以独立的继承一个类,而无论外围类是否已经继承了这个接口或者类。
结合下面的例子我们来进一步分析:
interface Incrementable { void increment(); } class Callee1 implements Incrementable { private int i = 0; public void increment() { i++; System.out.println(i); } public static class NestedClass{ public static void increment(){ System.out.println("NestedClass.increment()"); } } } class MyIncrement { public void increment() { System.out.println("Other operation"); } static void f(MyIncrement mi) { mi.increment(); } } class Callee2 extends MyIncrement { private int i = 0; @Override public void increment() { super.increment(); i++; System.out.println(i); } private class Closure implements Incrementable { public void increment() { Callee2.this.increment(); } } Incrementable getCallbackReference() { return new Closure(); } } class Caller { private Incrementable callbackReference; Caller(Incrementable cbh) { callbackReference = cbh; } void go() { callbackReference.increment(); } } public class Callbacks { public static void main(String[] args) { Callee1 c1 = new Callee1(); Callee2 c2 = new Callee2(); MyIncrement.f(c2); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go(); caller2.go(); caller2.go(); Callee1.NestedClass.increment(); } }
(1)我们可以看出closure内部类实现了接口Incrementable,而且为private类型的内部类,所以对于其他类来说它的完全隐藏的,但其使得外围类具有了接口Incrementable的功能,同时对于外界来说,也不能访问任何新增加的、本不属于公共接口的方法。
(2)闭包(closure) 是一个可调用的对象,它记录了一些信息,这些信息用于创建它的作用域。由于内部类不仅包含外围对象的信息,还自动拥有一个指向此外围类对象的引用,再此作用域内,内部类有权操作所有的成员,包括private成员。这有点类似指针。。
我们看到Callee2继承了MyIncrement,而MyIncrement已经有了一个increment()方法,Callee2想要在拥有一个不同的Increment()方法,于是通过内部类独立的实现Incrementable。
内部类Closure实现了Incrementable,而且还提供了返回Callee2的hook,而且比较的安全,无论谁获得此Incrementable的引用,都只能调用increment()(不像指针可以做很多的事情)。
(3)由于内部类具有继承多个类的能力,可以看出内部类有效的实现了“多重继承”,使得Java中的多重继承方案变得更加的完整。
嵌套类:
如果内部类声明为static,通常称为嵌套类。嵌套类与内部类不同的是,它的对象与外围类的对象之间不存在联系。而普通的内部类对象隐式的保存了一个引用,指向它的外围对象。
这一点可以通过反编译内部类与嵌套类的反编译代码看出来:
Callee1$NestedClass.class
Callee2$Closure.class
反编译后发现:
内部类多了一个构造方法
class Callee2$Closure implements Incrementable { private Callee2$Closure(Callee2 paramCallee2) {} public void increment() { this.this$0.increment(); } }
内部类还具有其他的一些特性
a)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围对象的信息相互独立。
b)在单个外围类中,可以让多个内部类以不同的方式实现统一接口,或继承同一个类。应用:命令设计模式
c)创建内部类的时刻并不依赖外围类的创建。
当然内部类比较的深奥和复杂,现在只是简单的理解它的语法,还需要在实际的应用中不断的思考和理解。
相关推荐
Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...
Java 内部类是 Java 语言的一个重要特性,它允许在一个类的内部定义另一个类。内部类的概念在 Java 中有着广泛的应用,特别是在处理复杂的继承问题和实现特定设计模式时。以下将详细介绍 Java 内部类的基本概念、...
"Java接口、内部类和Java_API基础" Java接口是Java语言中的一个抽象概念,它定义了一组方法的集合,但不提供实现。Java接口的主要特点是它不能被实例化,必须由其他类来实现。接口的声明格式为: ``` public ...
Java集合框架是Java编程...总之,这个资料包涵盖了Java集合框架和内部类的基础知识,对于想要深入理解Java编程的开发者来说,是一份宝贵的学习资源。通过学习,你可以提升在处理数据集合和实现复杂设计模式上的能力。
Java 内部类是 Java 编程语言中一个独特的特性,允许在一个类的定义内部定义另一个类。这种设计模式在某些场景下非常有用,比如实现匿名类、回调函数或者封装特定逻辑。以下是对内部类的详细解释和实例分析。 1. **...
Java基础内部类.xmind文件
Java接口和内部类是Java语言中两种重要的抽象机制,它们在软件设计中起着关键作用。接口主要用于定义对象之间的交互规范,而内部类则提供了一种封装和隐藏类的机制,使得类的设计更加灵活。 首先,接口是一个合约,...
JAVA基础——Java内部类.ppt
java 局部内部类的使用规范 java 局部内部类的使用规范
进入Java的高级主题,你会接触到诸如抽象类、接口、内部类、匿名类、枚举、注解、泛型、集合框架(如ArrayList、LinkedList、HashMap等)以及反射机制等。这些特性增强了代码的灵活性和可扩展性,使Java能够适应各种...
掌握java四中匿名内部类
总的来说,理解Java和Kotlin的内部类和静态嵌套类是成为一名合格的移动开发者的基础。通过学习和实践,你可以更好地组织代码,提高代码质量,同时降低维护成本。在提供的资源中,"java内部类嵌套类"和"kotlin内部类...
本篇笔记将详细介绍Java中的四种内部类:普通内部类、静态内部类、方法内部类以及匿名内部类。 ### A. 普通内部类 普通内部类(也称为成员内部类)是定义在外部类的成员位置,如同字段一样。它们可以直接访问外部...
Java 基础第七章 -内部类与异常类 本章节主要讲解 Java 的内部类和异常类的概念、特点、使用方法和注意事项。 内部类 ------ 内部类是 Java 支持的一种特殊类,定义在另一个类的内部。内部类和外嵌类之间存在关系...
了解了这些概念,让我们回到Java基础权限控制与final,内部类的主题。Java中,final和权限控制是面向对象编程中的核心概念。final关键字用于限制类、方法或变量的可变性,而权限控制则决定了类成员的可见性和可用...
Java内部类是Java编程语言中的一个独特特性,它允许在一个类的定义内部定义另一个类。这种设计模式在处理复杂的对象关系、实现匿名类以及提供更好的封装性时非常有用。在这个"JAVA_12内部类"的学习资料中,我们将会...
java语言基础:内部类2.pdf
尚硅谷_佟刚_Java基础_Java类设计.pdf): - 类与对象:理解面向对象编程的核心概念。 - 属性与方法:学习如何定义类的属性和行为。 - 构造器:了解构造函数的用途和使用场景。 - 访问修饰符:掌握public, ...
接口(interface)是一组常量和抽象方法的集合。接口是一种引用数据类型。 抽象方法的具体实现由实现接口的类完成,实现接口的类必须覆盖接口中的所有抽象方法。