- 浏览: 63674 次
- 性别:
- 来自: 成都
最新评论
-
hanmiao:
博客已经806天不再更新了,长草了都...
Effective Java读书笔试之创建和销毁对象 -
zhengjj_2009:
问你一个小问题,“Java虚拟机通过装载,连接和初始化一个Ja ...
深入JVM读书笔记之类装载+连接+初始化 -
Branding:
对!!!
类的初始化顺序 -
yuyiming1986:
为什么equals()相等的两个对象,hashCode( ...
hashCode()和equals方法 -
fd_zhaoshuo:
①两个obj,如果equals()相等,hashCode()一 ...
hashCode()和equals方法
内部类(inner class)
内部类(inner class)是定义在另一个类中的类。
代码结构形式如下
内部类又分为:普通内部类,局部内部类,匿名内部类,静态内部类,每一种内部类都有自己独特的应用场景。
1.为什么需要使用内部类?
内部类方法可以访问此类定义所在的作用域中所有成员属性,包括私有成员属性。
内部类可以对一个包中的其他类不可见。
想定义一个代码短小的回调函数时,可以使用匿名内部类比较便捷。
2.普通内部类
定义普通内部类的代码结构如下
定义在一个类中的内部类,可以有访问权限修饰符修饰,内部类与所属的外部类,可以相互访问,无权限限制.具体来说:
(1).内部类可以通过ClassType.this.outerVar 或者ClassType.this.outerMethod()来访问外部类的属性和方法; 如果内部类没有方法或者属性与外部类在命名上相冲突,则可以直接使用outerVar,调用outerMethod()进行访问。
(2).同样外部类,在创建内部内对象后,也可以直接访问内部内的属性和方法,无论是不是private.
(3).内部类如果使用private修饰,则只能由外部类内部来创建,如果使用public修饰则可以在直接创建一个内部类对象,前提要求必须先创建外部类对象,然后利用外部类对象来创建内部类对象,OuterClass.InnerClass obj = outerClassInstance.new InnserClass();
(纯粹个人观点,外部类与内部类存在着一对一的引用关系)
(4).从传统意义上讲,一个方法可以引用调用这个方法的对象数据域。而内部类既可以访问自身的数据域,也可以访问创建它的外围类的数据域。内部类的对象有一个隐式引用,指向了创建它的外围类对象的数据域.编译器会对内部类的构造函数进行修改,添加一个外围类引用的参数this指针到内部类当中,这解释了为什么内部类可以访问外部类的成员。
实例:
输出:
外部类访问内部类变量:innerVar
内部类访问外部变量:outerVar
2.局部内部类:可以在一个方法中定义局部类,局部类不能用public或者private访问修饰符进行修饰声明。它的作用域被限定在此声明此局部类的块或者方法中。局部类有一个优势,即对外部可以完全地隐藏起来。局部类还有另一个优势,它们不仅能访问包含它们的外围类的域,而且还可以访问局部变量。不过局部变量必须声明为final。
实例:
输出:
局部类访问外部类变量:outerVar
局部类访问方法中变量:localVar
3.匿名内部类:将局部内部类使用再深入一步,如果只创建此类的一个对象,就不必为这个类命名,这种类被称为匿名内部类(anonymous inner class).适用于比较短小的代码类。
通常语法格式为:
superType可以是接口,那么内部类就相当于实现了这个接口;如果superType是一个类,那么内部类相当于继承并且扩展它。
由于构造函数的名字必须与类名相同,而匿名类是没有类名,所以,匿名类不能有构造器。类是匿名的,无法定义构造函数来传递参数。
构造一个类的新对象与构造一个扩展了那个类的匿名内部类对象之间有什么差别。如果构造参数的()后面跟着一个{},那么正在定义的就是匿名内部类。
Person queue = new Person();
Person count = new Person(){};
示例:
输出:
匿名类中实现接口testAnonymousClass()方法
call dump() of AnonymousClass
call dump of extends AnonymousClass
4.静态内部类
有时候,使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围对象。为此,可以将内部类声明为static,以取消产生的外部类引用,使用得内部类无法访问外部类对象(但是可以访问外部类的静态成员变量和方法,其实相当于没有静态内部类没有外部类的this指针)。静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
示例:
输出:
outerStaticVar
call outerStaticMethod()
内部类(inner class)是定义在另一个类中的类。
代码结构形式如下
class ClassType{ //注意这并不是声明一个成员属性,而是定义一个内部类 private class InnerClassType{ } }
内部类又分为:普通内部类,局部内部类,匿名内部类,静态内部类,每一种内部类都有自己独特的应用场景。
1.为什么需要使用内部类?
内部类方法可以访问此类定义所在的作用域中所有成员属性,包括私有成员属性。
内部类可以对一个包中的其他类不可见。
想定义一个代码短小的回调函数时,可以使用匿名内部类比较便捷。
2.普通内部类
定义普通内部类的代码结构如下
class ClassType{ //private修饰内部类,说明只能由ClassType内部来创建这个内部类的对象。 //外部不能创建这个内部类的对象 private class InnerClassType{ } }
定义在一个类中的内部类,可以有访问权限修饰符修饰,内部类与所属的外部类,可以相互访问,无权限限制.具体来说:
(1).内部类可以通过ClassType.this.outerVar 或者ClassType.this.outerMethod()来访问外部类的属性和方法; 如果内部类没有方法或者属性与外部类在命名上相冲突,则可以直接使用outerVar,调用outerMethod()进行访问。
(2).同样外部类,在创建内部内对象后,也可以直接访问内部内的属性和方法,无论是不是private.
(3).内部类如果使用private修饰,则只能由外部类内部来创建,如果使用public修饰则可以在直接创建一个内部类对象,前提要求必须先创建外部类对象,然后利用外部类对象来创建内部类对象,OuterClass.InnerClass obj = outerClassInstance.new InnserClass();
(纯粹个人观点,外部类与内部类存在着一对一的引用关系)
(4).从传统意义上讲,一个方法可以引用调用这个方法的对象数据域。而内部类既可以访问自身的数据域,也可以访问创建它的外围类的数据域。内部类的对象有一个隐式引用,指向了创建它的外围类对象的数据域.编译器会对内部类的构造函数进行修改,添加一个外围类引用的参数this指针到内部类当中,这解释了为什么内部类可以访问外部类的成员。
实例:
class OuterClass{ private String outerVar = "outerVar"; //定义一个内部类 public class InnerClass{ private String innerVar = "innerVar"; private void visitOuter(){ //或者访问outerVar使用OuterClass.this.outerVar System.out.println("内部类访问外部变量:"+outerVar); } } //外部类访问内部类的方法visitInnerClass() public void visitInnerClass(){ InnerClass inner = new InnerClass(); System.out.println("外部类访问内部类变量:"+inner.innerVar); inner.visitOuter(); } } public class CommonInnerClass { public static void main(String[] args) { OuterClass ct = new OuterClass(); //可以直接创建内部类OuterClass.InnerClass inner = ct.new InnerClass(); ct.visitInnerClass(); } }
输出:
外部类访问内部类变量:innerVar
内部类访问外部变量:outerVar
2.局部内部类:可以在一个方法中定义局部类,局部类不能用public或者private访问修饰符进行修饰声明。它的作用域被限定在此声明此局部类的块或者方法中。局部类有一个优势,即对外部可以完全地隐藏起来。局部类还有另一个优势,它们不仅能访问包含它们的外围类的域,而且还可以访问局部变量。不过局部变量必须声明为final。
实例:
public class TestLocalClass { private String outerVar = "outerVar"; //局部方法test() public void test(){ final String localVar = "localVar"; //在方法test()中定义局部类LocalClass class LocalClass{ private void testAccess(){ System.out.println("局部类访问外部类变量:"+TestLocalClass.this.outerVar); System.out.println("局部类访问方法中变量:"+localVar); } } LocalClass lc = new LocalClass(); lc.testAccess(); } public static void main(String[] args) { TestLocalClass tl = new TestLocalClass(); tl.test(); } }
输出:
局部类访问外部类变量:outerVar
局部类访问方法中变量:localVar
3.匿名内部类:将局部内部类使用再深入一步,如果只创建此类的一个对象,就不必为这个类命名,这种类被称为匿名内部类(anonymous inner class).适用于比较短小的代码类。
通常语法格式为:
new SuperType(){ inner class emthods and data; }
superType可以是接口,那么内部类就相当于实现了这个接口;如果superType是一个类,那么内部类相当于继承并且扩展它。
由于构造函数的名字必须与类名相同,而匿名类是没有类名,所以,匿名类不能有构造器。类是匿名的,无法定义构造函数来传递参数。
构造一个类的新对象与构造一个扩展了那个类的匿名内部类对象之间有什么差别。如果构造参数的()后面跟着一个{},那么正在定义的就是匿名内部类。
Person queue = new Person();
Person count = new Person(){};
示例:
interface AnonymousInterface{ public void testAnonymousClass(); } class AnonymousClass{ public void dump(){ System.out.println("call dump() of AnonymousClass"); } } public class TestAnonymousClass { public static void main(String[] args) { //测试实现接口的匿名类 AnonymousInterface obj = new AnonymousInterface(){ public void testAnonymousClass() { System.out.println("匿名类中实现接口testAnonymousClass()方法"); } }; obj.testAnonymousClass(); //测试继承并扩展父类的匿名类 AnonymousClass anonymousObj = new AnonymousClass(){ public void dump(){ super.dump(); System.out.println("call dump of extended AnonymousClass"); } }; anonymousObj.dump(); } }
输出:
匿名类中实现接口testAnonymousClass()方法
call dump() of AnonymousClass
call dump of extends AnonymousClass
4.静态内部类
有时候,使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围对象。为此,可以将内部类声明为static,以取消产生的外部类引用,使用得内部类无法访问外部类对象(但是可以访问外部类的静态成员变量和方法,其实相当于没有静态内部类没有外部类的this指针)。静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
class ClassType{ public static class InnerClassType{ } }
示例:
public class TestStaicClass { private static String outerStaticVar = "outerStaticVar"; private String outerVar = "outerVar"; private static void outerStaticMethod(){ System.out.println("call outerStaticMethod()"); } //静态内部类访问外部类的静态变量outerStaticVar和静态方法outerStaticMethod() private static class StaticClass{ public void testAccess(){ //不能访问外部类的非静态成员 //System.out.println(outerVar); System.out.println(outerStaticVar); outerStaticMethod(); } } public static void main(String[] args) { StaticClass sc = new StaticClass(); sc.testAccess(); } }
输出:
outerStaticVar
call outerStaticMethod()
发表评论
-
Java中的"for each"循环
2011-11-27 16:59 13621."for each"循环 JDK5 ... -
Java对象序列化
2011-11-24 19:21 4791Java对象序列化 对于一个存在Java虚拟机中的对 ... -
float f = 3.4语句正确吗?
2011-11-23 14:56 9647float f = 3.4语句正确吗] ... -
serialVersionUID
2011-11-22 20:31 1052serialVersionUID Java的序列化机制 ... -
如何编写一个自定义的Exception类
2011-11-22 20:11 2260如何编写一个自定义的Exception类 1.编写自定义异 ... -
Java线程新同步机制
2011-11-22 16:52 2682Java线程新的同步机制 1.可重入锁ReentrantLo ... -
Java线程wait-notify+sleep+synchronized
2011-11-21 20:40 62181.sleep-wait-yield区别 sleep是Th ... -
Math.round方法
2011-11-19 21:59 1069Math.round() java.lang.Math类有两 ... -
final&finally&finalize
2011-11-19 18:03 7821.final关键字可以用来修饰类,成员方法,方法的参数,成员 ... -
String str = new String("abc")创建几个对象?
2011-11-19 14:46 12741.在JVM中存在着一个字符串池,其中保存着很多的Stri ... -
类的初始化顺序
2011-11-19 14:05 1213类的初始化顺序 1.对于同一个类中的静态变量,静态初始化块, ... -
Java代码块
2011-11-15 22:19 4088Java代码块 一.在Java中,使用”{}”括起来的代码称 ... -
Java内存管理
2011-11-15 18:00 1099Java内存管理 一.Java内 ... -
Java内存管理
2011-11-15 18:00 0Java内存管理 一.Java内 ... -
hashCode()和equals方法
2011-11-13 16:56 15991.==是比较地址,equals() ... -
hashCode()和equals方法
2011-11-13 16:55 01.==是比较地址,equals() ... -
Java基础知识四
2011-11-10 23:48 9441.关于equals(),所有的类都继承了Object类,继承 ... -
Java基础知识三---static关键字
2011-11-10 14:06 842static变量,static函数,static块 1.st ... -
Java基础知识二
2011-11-10 14:04 7941.在Java中A a只是定义一个A类型的变量a,没有分配内存 ... -
Java基础知识一
2011-11-10 14:02 996(1).instanceof obj insta ...
相关推荐
Java 内部类 实例化 在Outer类的静态方法中实例化内部类 在同一个包的其它类中实例化Outer类中的内部类
在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部。
根据不同的定义位置和作用域,Java内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。下面将详细介绍这些内部类的定义和使用方法。 成员内部类 成员内部类是最常见的内部类形式,它定义在外部...
成员内部类是指在另一个类中定义但没有使用 `static` 关键字的类。它的定义格式如下: ```java public class 外部类 { ... class 成员内部类 { ... } } ``` **特点** - **访问权限**:成员内部类可以访问外部...
Java中的内部类与外部类是Java面向对象编程中一个重要的特性,它允许我们在一个类的内部定义另一个类。这种设计模式提供了更高级别的封装,并且能够实现一些特殊的功能,如匿名内部类、事件处理等。以下是对内部类与...
JAVA从JDK1.1开始引入了内部类,可以参见代码,感觉好处就是设计类的时候可以偷懒,呵呵。主要是可以引用类的内部其他元素,差不多是把这个内部类当成原类的元素。还有可以隐藏类的一些设计细节,好处还是很多的。
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...
Java 中内部类使用方法实战案例分析 Java 中内部类的使用方法是一个非常重要的知识点,它们可以帮助开发者更好地组织代码、提高代码的可读性和维护性。在本文中,我们将通过实战案例来分析 Java 中内部类的使用方法...
14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14...
### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...
在内部类中访问外部类的成员可以使用 `Outerclass.this` 来指定。 3. 局部内部类(Local Inner Class) 局部内部类定义在方法或代码块内,其作用域仅限于该方法或代码块。它们通常用于实现特定方法的功能,且只能...
Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为其成员。内部类的类体中不能声明...
Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部...
### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...
5. **静态方法调用**:在静态内部类中可以直接访问外部类的静态方法和变量,但是无法直接访问非静态成员。 6. **非静态方法调用限制**:如果需要访问外部类的非静态方法或变量,则必须通过外部类的对象引用来进行...
16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名...
Java内部类是Java语言中一个独特且强大的特性,它允许在一个类的定义内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java内部...
成员内部类的使用在Java编程中具有独特的价值,它能够帮助我们更好地封装代码,提高代码的组织性和可读性。以下是关于Java成员内部类的一些关键知识点: 1. **分类**:成员内部类分为两种,静态内部类(Static ...