Java内部类的意思就是定义在类中的类。一般来说可以分为四种:静态内部类、成员内部类、局部内部类以及匿名内部类。
简单描述一下几种内部类的定义方式,以及访问方式吧,实际开发中自己目前应用到内部类的情况还不多,只在一个tasksend工具类的编写中用过匿名内部类的方式,对于使用的新的慢慢总结吧。
一、静态内部类(Static Inner Class)
用static关键字修饰的内部类为静态内部类.
定义静态内部类:
package com.hdjava.innerclass;
public class StaticInnerClass {
private static int a = 1;
public static void output(){
System.out.println("这是外部类的静态方法");
}
@SuppressWarnings("unused")
public static class StaticInner{
public void method(){
System.out.println("访问外部类的静态变量 a:"+ a);
output();
}
}
}
测试类:
package com.hdjava.innerclass;
public class StaticInnerClassTest {
public static void main(String[] args) {
StaticInnerClass.StaticInner innerClass = new StaticInnerClass.StaticInner();
innerClass.method();
}
}
运行结果:
访问外部类的静态变量 a:1
这是外部类的静态方法
分析:
静态内部类只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方式为:
outerClass.InnerClass inner = new OuterClass.InnerClass()
二、成员内部类
成员内部类(Member Inner Class): 可以访问外部类的静态与非静态的方法与成员变量。
定义成员内部类:
package com.hdjava.innerclass;
public class MemberInnerClass {
private int a = 1;
public void output(){
System.out.println("这是外部类的方法");
}
@SuppressWarnings("unused")
public class MemberInner{
private int a = 2;
public void method(){
System.out.println("访问外部类的变量 a:"+ (MemberInnerClass.this).a);
System.out.println("访问内部类的变量 a:"+ a);
output();
}
}
}
测试类:
package com.hdjava.innerclass;
public class MemberInnerClassTest {
public static void main(String[] args) {
MemberInnerClass.MemberInner memberInner = (new MemberInnerClass()).new MemberInner();
memberInner.method();
}
}
运行结果:
访问外部类的变量 a:1
访问内部类的变量 a:2
这是外部类的方法
分析:
1、生成成员内部类对象的方式为:
OuterClass.InnerClass inner = (new OuterClass()).new InnerClass();
若想在局部内部类中访问外部类的与你内部类中成员变量重名成员变量,语法为:
OuterClass.this.a
三、局部内部类
局部内部类(Local Inner Class):定义在方法当中的内部类,声明周期随方法而定
定义局部内部类:
package com.hdjava.innerclass;
public class LocalInnerClass {
public void output(){
final int var = 1;
System.out.println("this is outClass's method output");
class InnerClass{
public void output(){
System.out.println("this is innerClass's method output");
System.out.println("outClass'field var="+var);
}
}
InnerClass in = new InnerClass();
in.output();
}
}
测试类:
package com.hdjava.innerclass;
public class LocalInnerClassTest {
public static void main(String[] args) {
LocalInnerClass test = new LocalInnerClass();
test.output();
}
}
运行结果:
this is outClass's method output
this is innerClass's method output
outClass'field var=1
分析:只能访问方法中声明的final类型的变量
四、匿名内部类
匿名内部类(Anonymous Inner Class):匿名内部类会隐式地继承一个父类或实现一个接口。
定义任意一个类,供匿名内部类继承用:
package com.hdjava.innerclass;
public class AnonymoursClass {
public void output(){
System.out.println("this is method output ");
}
}
测试类:
package com.hdjava.innerclass;
public class AnonymoursClassTest {
public static void main(String[] args) {
AnonymoursClass test1 = new AnonymoursClass();
test1.output();
AnonymoursClass test2 = new AnonymoursClass (){
public void output(){
System.out.println("this is Anonymours class'method output");
}
};
test2.output();
}
}
运行结果:
this is method output
this is Anonymours class'method output
下面摘录一些在其他文章中看到的关于内部类的观点:
A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
C、普通的类可以用this引用当前的对象,内部类也是如此。但是假若内部类想引用外部类当前的对象呢?用“外部类名”.this
D、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
以上A-D摘自: http://www.blogjava.net/raylong1982/archive/2007/10/24/155439.html
E、在成员内部类中,可以使用外围类的字段成员变量。那么,它是如何实现的呢? 是这样的,用外围类创建内部类对象时,此内部类对象会秘密的捕获一个指向外围类的引用,于是,可以通过这个引用来访问外围类的成员。通常,这些都是编译器来处理,我们看不到,也不用关心这个。 正是因为如此,我们创建内部类对象时,必须与外围类对象相关联。
F、 内部类最大好处就是保持跟外部类的生命周期一致,可以通过管理一个类的生命周期来维护俩个类的生命周期在线成池,连接池,通信套接字是必然用到的这些要求内存管理很高的时候,对类的生命是必须负责的,但过多的类不好维护,通常为便于方便维护,就将归纳并放在一起。
以上E-F摘自http://www.iteye.com/topic/939534?page=3
G、如果你声明的成员类不要求访问外围实例,那么请记住把 static 修饰符放到成员类的声明中,使它成为一个静态成员类,而不是一个非静态成员类 。如果你省略了 static 修饰符,则每个实例都将包含一个额外的指向外围对象的引用 。维护这份引用要消耗时间和空间,但又没有相应的好处 。如果在没有外围实例的情况下,你也要分配实例的话,则不能使用非静态成员类,因为非静态成员类的实例必须要有一个外围实例。
以上G摘自http://xutao5641745.iteye.com/blog/939912
分享到:
相关推荐
### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他...在实践过程中,不断学习和总结,你将成为Java编程的专家。
这篇总结将深入探讨匿名内部类的相关知识点。 1. **匿名内部类的概念** 匿名内部类是内部类的一种特殊形式,它没有类名,常用于一次性创建的对象,特别是在需要实现一个接口或继承一个类,但又不需要额外的方法时...
### Java视频学习总结知识点 #### 抽象方法与抽象类 在Java中,抽象方法是一种没有具体实现(方法体)的方法,它仅提供方法签名,而具体的实现留给子类完成。一个类如果包含一个或多个抽象方法,那么这个类必须被...
### Java 学习基本知识总结 #### Java基础入门 ##### Java语言概述 - **起源与发展**:Java由Sun Microsystems公司于1995年推出,最初由James Gosling设计。它是一种面向对象、跨平台的高级编程语言。 - **特点**...
通过本文的学习,我们了解了如何使用Java反射技术来获取内部类中的静态成员变量的值。反射技术虽然强大,但也需要注意其使用场景和可能带来的负面影响。希望本文能帮助大家更好地理解和掌握Java反射技术的应用。
### Java内部类访问规则 #### 一、内部类概述与定义原则 在Java编程中,内部类(Inner Class)是一种特殊类型的类,它被定义在另一个类(外部类)的内部。内部类的一个主要用途是在描述一个外部类的对象时能够包含...
### Java学习笔记——内部类详解 #### 一、引言 Java中的内部类是一个非常有用但又容易让人感到困惑的概念。内部类本质上是在另一个类的内部定义的类,它可以访问外部类的所有成员变量和方法,甚至是私有成员。...
以下是对Java学习的详细总结: 一、简介 Java由James Gosling于1995年在Sun Microsystems公司开发,最初设计用于电视顶盒,但后来因其“一次编写,到处运行”(Write Once, Run Anywhere)的理念,迅速被广泛应用在...
### 核心Java集合框架学习总结 #### 一、概述 在Java编程语言中,集合框架是一组用于存储和操作对象的接口和类。这些接口和类提供了多种数据组织方式,如列表、集合并和映射等。本篇文章将重点介绍集合框架中的几...
总结来说,Java内部类是一个强大的工具,它可以增强代码的封装性和复用性,尤其是在处理复杂的对象关系和事件监听等场景。通过深入学习和实践,开发者能够更灵活地运用这一特性,提高代码质量。在这个压缩包中的Java...
总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...
### Java内部类详解 #### 一、嵌套类概述 在Java编程中,嵌套类是一种重要的面向对象设计工具,它允许程序员在一个类的内部定义另一个类。这种特性极大地增强了Java语言的灵活性和封装能力。 #### 二、嵌套类分类...
### JAVA中的继承学习总结 #### 一、Java中的继承概念 继承是面向对象编程(OOP)的一个核心概念,它使得我们可以定义一个类继承另一个类的字段和方法。这样做的好处是可以减少代码冗余,提高代码复用性。在Java中,...
### Java中的集合学习总结 #### 集合框架概述 在Java编程语言中,集合框架是一种存储和操作数据的重要机制。它提供了灵活多样的数据结构,以满足不同场景下的需求。集合框架主要由三大核心部分组成:集(Set)、列表...
这个"java_se 学习总结项目"包含了丰富的Java学习资料,旨在帮助开发者深入理解Java编程语言,提升技能。以下是对这个项目中可能包含的知识点的详细说明: 1. **Java基础**: - **语法特性**:包括变量、数据类型...
Java知识体系总结 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年推出。它以其“一次编写,到处运行”的特性闻名,适用于开发跨平台的应用程序,包括桌面应用、企业...