`
lvjun106
  • 浏览: 437042 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖
社区版块
存档分类
最新评论

回顾《JAVA编程思想》第四版 第十章 内部类特点和实现JAVA“多重继承”

 
阅读更多

什么是内部类,匿名类,匿名接口,匿名方法?

内部类有什么特点?

内部类有哪些应用?

JAVA语言是一个JAVA文件名对应一个类名称,在类作用域里面所定义的类就是内部类,它可以是静态,或是非静态的。而我们关注的大部分是非静态内部类。为什么要定义内部类呢?

从面向对象来讲,比如人有心脏,人被定义成类后,心脏是其身体必要的一部分,在设计时,我们可以把心脏定义成外部类,但是设计成内部类不是更加符合现实意义吗?是的。

对于现实世界中的场景抽象,很多都需要内部类的支持。当然这不仅仅是SUN公司设计出内部类的唯一用处,内部类最大的特点就是其不是单一存在,其还有一个外部对象的引用,在内部类中可以任意操作外部对象的属性和方法,包括private。我引用了《Think in Java》中的代码。

 

package thinkInJava;

public class Outer {

	private int o_a = 10;

	public void print() {
		System.out.println(o_a);
	}

	public Inner newInner() {
		return new Inner();
	}

	class Inner {
		private int i_b = 5;
		public Outer getOuter() {
			return Outer.this;
		}
		public void showstop() {
			System.out.println(o_a);
		}
	}

	public static void main(String args[]) {
		Outer outer = new Outer();
		Inner inner = outer.newInner();
		inner.getOuter().print();
		inner.showstop();
	}
}

所以说脱离了外部对象,内部对象是不可能存在的(静态内部类除外)。同样代码附上。

 

package thinkInJava;

public class Outer {

	private int o_a = 10;

	public void print() {
		System.out.println(o_a);
	}

	public Inner newInner() {
		return new Inner();
	}

	static class Inner {
		private int i_b = 5;
		public void print(){
			System.out.println(i_b);
		}
		public void haveATry() {
			i_b++;
		}
	}

	public static void main(String args[]) {
		Outer outer = new Outer();
		Inner inner = outer.newInner();
		inner.print();
		inner.haveATry();
		Outer.Inner inner1 = new Inner();
		inner1.print();
		Outer outer1 = new Outer();
		Inner inner2 = outer1.newInner();
		inner2.print();
	}
}

 

这里有一点,是Inner没办法用.this来获取外部类实例,

有一些注意点,一是非内部类中是不允许有内部变量、方法或类,即不允许定义静态内部成员

因为静态变量的作用就是让所有类对象共享一个状态,而这和内部类要依赖外部类对象存在产生矛盾。

内部类可以继承类或实现接口。典型的类子可以看一看HashMap,HashTable的源码,里面定义了Entry内部类,而且此内部类实现了Map.Entry的接口。

二是我们也应该关注到SUN引入内部类的又一优点,就是变相实现了JAVA多重继承,本身一个类是没办法继承多个类的,但是可以定义多个内部类,之后对内部类的一系列操作来实现这个特点。当然,你也可以用asm来实现JAVA多重继承。

 

public class Outer {
	class InnerA extends A {
	}

	class InnerB extends B {
	}
	......
}

 

三是内部类下面还可以再定义内部类,理论上应该可以无限嵌套下去(这个没试过……)。

四是可以匿名定义类,接口。最相关的实例就是SWING中GUI的事件驱动模型,和声明各种监听器。

五是内部类/接口可以被继承/实现,但是初始化要同时关联到内部类的外部对象

 

package thinkInJava;

class WithInner{
	class Inner{}
}
public class Outer extends WithInner.Inner{
	
	public Outer(WithInner wi){
		wi.super();
	}
	
	public static void main(String args[]) {
		WithInner wi = new WithInner();
		Outer t = new Outer(wi);
	}
}

 六是内部类不可以被外部类的子类覆盖,二者是独立存在的。

package thinkInJava;

public class Outer {

	class WithInner {
		class Inner {
			public void print() {
				System.out.println("super inner class");
			}
		}

	}

	class InheritWithInner extends WithInner {
		class Inner {
			public void print() {
				System.out.println("child inner class");
			}
		}

		public Inner newInner() {
			return new InheritWithInner.Inner();
		}

		public WithInner.Inner newInner1() {
			return new WithInner.Inner();
		}
	}

	public void test() {
		InheritWithInner tt = new InheritWithInner();
		tt.newInner().print();
		tt.newInner1().print();
	}

	public static void main(String args[]) {
		Outer outer = new Outer();
		outer.test();
	}
}
 

 

对于内部类,自己还是需要大量时间去使用,去体会。适时用,用的好。

分享到:
评论

相关推荐

    Thinking in Java 中文第四版+习题答案

    7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 内部类标识符 7.6.9 为什么要用内部类:控制框架 7.7 构建器和多形性 7.7.1 构建器的调用顺序 7.7.2 继承和 7.7.3 构建器内部的多形性方法的行为 7.8 通过继承...

    java编程思想习题及答案

    《Java编程思想习题及答案》是一份针对Java编程学习者的宝贵资源,它包含了大量关于Java编程的习题和对应的解答。这份资料可能是从www.pigkrtv.com等网站转载而来,旨在帮助学习者深化对Java编程语言的理解,提高...

    Java语言程序设计第10版(基础篇)复习题答案

    《Java语言程序设计第10版(基础篇)》是一本深入浅出的Java编程教材,旨在帮助初学者掌握这门强大的面向对象编程语言。复习题答案提供了对每一章节核心概念的检验和巩固,帮助读者确认对每个主题的理解是否到位。...

    优质java课件 java程序设计教程(第6版)08.继承(共14页).ppt

    优质java课件 java程序设计教程(第6版)01.计算机系统概述(共42页).ppt 优质java课件 java程序设计教程(第6版)02.数据与表达式(共62页).ppt 优质java课件 java程序设计教程(第6版)03.使用类和对象(共49页...

    JAVA2参考大全 第四版

    ### JAVA2参考大全 第四版:Java的起源与演进 #### Java的诞生背景与动机 在探索Java的根源之前,我们先回顾一下计算机语言的发展脉络。B语言的出现催生了C语言,随后C语言的进化衍生出了C++,而今,C++正逐步被...

    中文 Java编程思想(完整的中文简体第二版)

    ### 中文 Java编程思想(完整的中文简体第二版) #### 重要知识点概览 本教材由Bruce Eckel撰写,智慧东方工作室翻译,是一本全面深入介绍Java编程语言的经典之作。本书不仅适合Java初学者,也适合希望深入了解Java...

    Java经典编程50道

    3. Class33.java:可能涉及到面向对象编程,包括封装、继承和多态,如定义类、接口,以及重写`equals()`和`hashCode()`方法。 4. Class07.java:可能与文件操作有关,例如使用`File`类进行文件的创建、读取、写入,...

    java2实用教程

    《java2实用教程》涵盖了Java语言的基础知识和一些高级特性,适合初学者系统学习Java编程。以下是书中各章节的知识点总结: 第一章:JAVA语言入门 1.1 JAVA的诞生:介绍了Java语言的历史背景,它是由Sun ...

    java 编程入门思考

    7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 内部类标识符 7.6.9 为什么要用内部类:控制框架 7.7 构建器和多形性 7.7.1 构建器的调用顺序 7.7.2 继承和finalize() 7.7.3 构建器内部的多形性方法的行为 7.8 ...

    51CTO学院-《Java编程思想》精讲视频教程(上部).docx

    - **并发编程**:介绍 Java 中实现并发编程的方法和技术。 - **Java 与 Internet**:探索 Java 在网络编程方面的应用。 - **总结**:回顾本章主要内容并进行总结。 ### 第二章:一切都是对象 本章深入探讨了 Java ...

    java程序设计教程(清华大学)

    5. **第8章 泛型-枚举-内部类**:泛型提供了类型安全,枚举用于定义常量集合,而内部类则是Java中实现复杂设计模式的重要工具。 6. **第9章 异常**:讲解了如何处理运行时错误和异常,包括try-catch-finally语句块...

    JAVA编程课件 Ch05-继承

    - **属性**:`Manager`类拥有的属性包括从`Employee`类继承过来的`name`和`salary`,以及自身定义的`bonus`。 - **方法**:除了继承自`Employee`类的`getName()`和`setSalary()`方法外,`Manager`类还定义了自己的`...

    使用Java实现数据库编程笔记.txt

    ### 使用Java实现数据库编程知识点详解 #### 一、数据库的设计 **1. 规范设计数据库的步骤** - **收集信息**:明确需求,包括业务流程、数据需求等。 - **标识实体**:识别出系统中需要存储的主要对象或概念。 - ...

    Java语言程序设计(第二版)课后第三章习题答案

    在本资源中,我们主要关注的是“Java语言程序设计(第二版)”一书的第三章课后习题答案,特别是那些涉及编程代码的问题。Java是一种广泛应用的面向对象的编程语言,以其平台无关性、安全性和高效性而受到赞誉。在...

    JAVA遗传算法编程pdf版本书籍

    为了使读者能够顺利地用Java实现遗传算法,书中会回顾Java编程的基础知识,包括数据类型、控制结构、类与对象、接口、异常处理、多线程等,确保读者具备必要的编程技能。 三、遗传算法的Java实现 书中将详细阐述...

    用于回顾java基础知识 Java学习资

    "用于回顾java基础知识"的标题和描述暗示了我们将探讨的是Java的基础概念,这可能包括语法、类、对象、数据类型、控制结构等核心概念。下面我们将深入这些主题,帮助你巩固Java编程的基础。 1. **Java简介**:Java...

    基于JAVA编程的坦克大战

    《基于JAVA编程的坦克大战》是一款使用Java编程语言开发的经典射击游戏,其核心特性包括查看历史记录、单双人模式、背景音乐、地图更换、游戏难度调整以及详细的游戏说明。这款游戏中,玩家可以独自作战或者与朋友...

    java开发实战经典习题答案

    - Java多线程编程的基础知识,如创建线程的方式(继承Thread类或实现Runnable接口)、同步机制(synchronized、volatile关键字)。 8. 常用类库 - Java标准库中提供的常用类,例如集合框架(Collection Framework...

Global site tag (gtag.js) - Google Analytics