转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45372395
一、前言
内部类也称寄生类,就是把一个类放在类里面(即内部类的上一级程序单元是类)定义,将其作为外部类的成员。内部类主要用几种定义形式:静态(static)内部类,非静态内部类,匿名内部类(也就是没有名字的寄生类)。内部类的好处就是内部类可以直接外部类的(包括私有)成员,反之不能。下面我们通过一些实例来详细讲解一下Java中内部类的使用及几种定义形式的相互调用。
二、实例说明
(1)匿名内部类:当程序创建匿名内部类时,会立即创建匿名内部类(实现类)的实例。
interface IBreathe { void breathe(); } /** * 匿名内部类的使用,定义形式如下: * * new 接口() | 父类构造器<参数>){ * // 类体部分... * }; * * @author [*昨日重现*] lhy_ycu@163.com * @since version 1.0 * @datetime 2015年4月29日 下午10:17:40 */ public class Anonymous { // 这里相当于创建了接口IBreathe的匿名实现类,并创建了匿名内部类的实例 // 将实现类的实例赋值给接口变量 ,属于向上转型 IBreathe breathe = new IBreathe() { // 必须实现接口里的所有抽象方法 @Override public void breathe() { System.out.println("呼吸新鲜空气..."); } }; public static void main(String[] args) { Anonymous anonymous = new Anonymous(); anonymous.breathe.breathe(); } }
注意以下几点:
1)只要父类是抽象类或者是一个接口,那么其子类中的方法都可以使用匿名内部类来实现;反过来也就是说使用匿名内部类有个前提:它必须显示地继承一个父类或实现一个接口。
2)匿名内部类必须实现接口或抽象类中所有的抽象方法。
3)匿名内部类适合创建只需一次使用的类。
4)匿名内部类不能有构造器而且程序以后无法再访问它,因为它没有类名。
(2)静态内部类:它属于外部类(宿主类)的静态成员,所以它不能访问外部类的非静态成员(属性、方法)。
/** * 外部类(宿主类)中包含静态内部类作为外部类的一个静态成员 * * @author [*昨日重现*] lhy_ycu@163.com * @since version 1.0 * @datetime 2015年4月29日 下午11:00:51 */ public class Out { private static String name = "张三"; private String sex = "男"; static class In { private static String name = "李四"; public void info() { // 静态内部类不能访问外部类的非静态成员,所以下面这句会编译不通过 // System.out.println("外部类的sex = " + sex); System.out.println("in的info方法被调用,name:" + name); } } public static void main(String[] args) { // 打印结果(编译器遵循就近原则):in的info方法被调用,name:李四 // 这里只需要把外部类当成静态内部类的包就行了 // 所以In前加不加Out.都是一样的 new In().info(); new Out.In().info(); } }
如果要在外部类的外面访问静态内部类的成员:Out.In in = new Out.In();in.info();当然,静态内部类也可以派生子类:class InSub extends Out.In {},编写和调用方式与普通类一样,这里不再赘述。下面看看重点来看看非静态内部类定义和使用。
(3)非静态内部类:在创建非静态内部类的实例前,必须先创建外部类实例,也就是说非静态内部类必须寄生在外部类的实例(Outer.this)里面。所以在创建非静态内部类的实例前,必须先创建外部类实例。
/** * 非静态内部类的使用 * * @author [*昨日重现*] lhy_ycu@163.com * @since version 1.0 * @datetime 2015年4月29日 下午11:26:06 */ public class Outer { int number = 10; // 定义非静态内部类 class Inner { int number = 100; public void info() { int number = 1000; System.out.println("Inner内部类的info()方法被调用~"); System.out.println("number变量的值为:" + number);// 方法的局部变量,所以为1000 System.out.println("number变量的值为:" + this.number);// 指向寄生类成员,所以为100 System.out.println("number变量的值为:" + Outer.this.number);// 指向宿主类成员,所以为10 } } /** * 通过外部类的方法来访问寄生类的成员(属性、方法) */ public void info() { System.out.println("Outer外部类的info()方法被调用~"); Inner inner = new Inner(); inner.info(); System.out.println(inner.number); } public static void main(String[] args) { new Outer().info(); } }
如果在外部类的外面使用内部类,那么在创建非静态内部类的实例前,必须先创建外部类实例。
Outer outer = new Outer();
Outer.Inner in = outer.new Inner();
等价于==》Outer.Inner in2 = new Outer().new Inner();
当然非静态内部类也可以派生子类,如下:
//非静态内部类派生子类 class InnerSub extends Outer.Inner { public InnerSub() { // 由于Outer.Inner是非静态内部类,因此必须使用"宿主对象"来调用它的构造器 new Outer().super(); }}
三、总结
1)有static修饰的内部类属于外部类本身,没有static修饰的内部类属于类实例 。
2)记住方法是谁的,就用谁来调用。
3)没有static修饰的内部类,【必须寄生在“外部类”的实例里】;反之则寄生在外部类本身里。
4)静态内部类是寄生在类本身里面的,所以就不需要程序员理会宿主。-把外部类当成静态内部类的包就行了。
5)非静态内部类派生子类:由于子类的构造器必须调用父类构造器一次,因此必须在子类构造器中使用宿主对象来调用它的构造器。
四、结束语
关于Java中的内部类的定义和使用基本内容就这些,后面会陆续更新包括:正则表达式、Java性能优化、学习JVM等等,敬请关注。
相关推荐
"Java面向对象编程实例详解2.txt"和"Java面向对象编程实例详解.txt"可能包含了详细的讲解和示例代码,涵盖了类的创建、对象的实例化、访问控制、构造函数、抽象类和接口、异常处理、集合框架等方面的知识。...
Java 内部类详解 Java 内部类是一种高级特性,允许在一个类的定义内部创建另一个类。这种设计模式提供了更灵活的代码组织方式,同时还可以实现特定的封装和访问控制。内部类主要分为四种类型:静态内部类、成员内部...
### Java面向对象之内部类与异常详解 #### 内部类概述 在Java编程语言中,内部类(Inner Class)是一种特殊类型的类,它被定义在另一个类的内部。内部类使得程序设计更加灵活和模块化,允许更复杂的类结构和逻辑...
二、Java面向对象特性详解 1. 抽象:抽象是将共同特征抽取出来形成类的过程,Java通过抽象类和接口实现抽象。 2. 构造器:构造器用于初始化新创建的对象,Java中的构造器与类同名且无返回值。 3. 访问控制修饰符:...
在这个“java了解面向对象与类 详解 java实例20”的主题中,我们将深入探讨面向对象编程的基本概念,以及如何在Java中实现这些概念。 首先,我们需要理解什么是面向对象编程(Object-Oriented Programming,OOP)。...
Java面向对象基础与高级知识点详解 Java是一种广泛使用的面向对象编程语言,它的设计哲学是“一切皆对象”。本讲义将全面深入地介绍Java面向对象的基础概念和高级特性,帮助开发者从初学者到精通者逐步提升技能。 ...
Java学习系列(五):Java面向对象之抽象类、接口、内部类、枚举类详解 本章节主要讲解Java面向对象的其他概念,包括抽象类、接口、内部类、枚举类。抽象类是一种特殊的类,不能被实例化,用于定义一些公用的方法和...
【Java面向对象之继承练习题】的解析与详解: 1. **类的继承**:在Java中,继承是面向对象编程的重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法。例如,我们可以创建一个`Music`类作为其他音乐相关...
### JAVA面向对象基础知识点详解 #### 一、面向对象编程语言的发展史 面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,其核心在于将现实世界中的对象及其属性和行为映射到软件系统中...
### Java面向对象基础知识点详解 #### 一、面向对象的基本概念 面向对象编程(Object-Oriented Programming,简称OOP)是一种程序设计思想,它强调的是以对象为核心来进行程序设计。面向对象的主要特点包括封装性、...
【Java面向对象编程课件详解】 Java是一种广泛使用的高级编程语言,以其面向对象特性而闻名。面向对象编程(Object-Oriented Programming,OOP)是Java的核心,它将现实世界中的概念映射到代码中,使得程序设计更加...
Java内部类是Java编程语言中的一个特色特性,它允许在一个类的定义内部定义另一个类。这种设计模式在处理复杂的代码组织...学习和理解Java内部类有助于提升代码的灵活性和可维护性,尤其是在处理复杂的面向对象设计时。
根据提供的文件信息,我们可以归纳和解析出多个与Java面向对象编程相关的知识点,下面将逐一进行详细阐述。 ### 1. Switch 语句的理解 - **题目解析**:给出的示例代码展示了如何使用 `switch` 语句进行条件判断。...
面向对象与Java程序设计是软件开发领域中的核心概念,朱福喜的著作深入浅出地讲解了这些主题,为开发者提供了宝贵的资源。本教程重点围绕Java语言和面向对象编程的基本概念,结合课后习题答案,帮助读者巩固理解并...
《Java2面向对象程序设计》一书的课后习题详解旨在帮助读者深入理解和掌握Java编程语言的核心概念,特别是面向对象的设计原则和实践。书中的习题涵盖了从Java语言的历史、基本语法到高级特性等多个方面,以下是对...
### JAVA面向对象程序设计知识点详解 #### 一、Font类详解 Font类是Java AWT包中的一个重要组成部分,主要用于设置程序中的字体实例对象。通过Font类,开发者可以在Java应用程序中自定义字体,包括字体的外观、样式...
### 浅谈Java面向对象与引用 在Java学习过程中,对于面向对象的理解和引用机制的掌握是至关重要的。本文将围绕这两个概念进行深入探讨,并针对初学者常见的疑惑点进行解答。 #### Java面向对象基础 Java是一种...
### 面向对象原理与Java实践课程实验-对象和类 #### 实验目的与要求 本实验的主要目的是让学生深入理解面向对象编程的核心概念之一——类与对象,并通过实际编程来掌握这些概念的具体应用。实验重点包括: 1. **...
### Java 类修饰词详解 Java 作为一种广泛使用的面向...综上所述,Java 中的类修饰词和内部类在设计和实现面向对象程序时起着至关重要的作用。正确理解和使用这些概念可以帮助开发者构建更加灵活和可维护的软件系统。