java内部类的一些看法

java内部类, 我在看《thinking in java》的时候总感觉模棱两可的, 挣扎了好几天之后, 感觉有一部分的问题想的清楚了, 写一个随笔记录一下, 以备以后修改和查看

什么是内部类?

  内部类说白了就是类套类, 在一个类里面写一个类, 内部类分为两种, 一种是普通内部类(non-static nested class), 第二种是静态内部类(static nested class),也叫嵌套类.

  普通内部类还包括两种特殊的类型, 一种是局部内部类, 另一种是匿名内部类

内部类有什么作用?

  1. 最简单的功能 : 一种有效的代码隐藏机制, 将某些功能放置在一起组合形成一个新的类, 而且这个新类可以任意访问类的所有成员. 有效地提高了代码的封装型性, 使写出来的代码更加便于理解
  2. 实现了类逻辑上的分组: 比如 一个类A仅仅只对类B有用处, A是B的辅助类, 或者说仅希望A对B起作用, 那么在逻辑上A已经属于了B类, 内部类就恰好实现了这个逻辑
  3. 和interface一起真正实现了多重继承 : 因为一个类允许存在多个内部类, 而内部类可以随意访问类的所有成员, 那么就可以通过在不同的内部类继承不同的类, 实现不同的接口在真正意义上完成多重继承的任务.
  4. 通过内部类提供闭包的功能, 或者说模拟闭包的功能(这部分暂时没有完全弄明白)

什么是闭包?

  《thinking in java》有一段原话感觉很贴切:

闭包(closure)是一个可调用的对象, 这个对象记录着一些信息, 这些信息来自于创建他的作用域.

通过回调, 对象可以携带一些信息, 这些信息允许它在将来某个时刻调用初始的对象.

内部类就是面向对象的闭包, 创建一个内部类, 就会得到一个外部类的引用, 通过这个引用, 我们可以调用外部类对象的所有成员, 当然这些成员就是所谓的“创建他的域的信息”。除此之外,使用内部类完成闭包更加安全,因为返回的是一个引用,而不是一个指针,指针和引用可操作的权限差异不止一点点。

为什么普通内部类中不能包含static方法、static字段和嵌套类?

  因为static所修饰的属性、方法都是和类相关,而非类对象相关。static成员的访问可以直接通过classname.staticField进行,而内部类的创建是和外部类相关联的,也就是要使用内部类,必须创建一个相关的外部类以提供引用,如果允许static成员的存在,那么就可以通过Outer.Inner.staticField进行访问,与是否存在外部类无关,所以不允许包含static成员。

  但是普通内部类却可以包含static final类型的成员, 因为static final类型的成员是静态常量,在编译期就会将所有用到该成员的地方替换成相对应的子面值常量。所以static final类型的成员只能使用常量表达式进行初始化。

例如:

class SS {
	public class Test1
	{
		public static final String str ="";
		public static final Integer d = new Integer(25) ; //报错:The field d cannot be declared static in a non-static inner type, unless initialized with a constant expression
	}
}

  为什么

//Java中普通内部类为何不能有static数据和static字段,也不能包含嵌套类 :http://www.dewen.io/q/13793

//thinking in java笔记,如果有不对的地方,还望指正^_^

时间: 2024-10-03 01:25:44

java内部类的一些看法的相关文章

Java内部类

本文是<Java核心技术 卷1>中第六章接口与内部类中关于内部类的阅读总结. Java中的内部类(inner class)是定义在另一个类内部的类.那么内部类有什么用呢?这里主要由三个内部类存在的原因: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据.即,如果类A中定义了类B,那么类B可以访问类A中的数据,甚至是私有数据,但类A不能访问类B中的私有数据: 内部类可以对同一个包中的其他类隐藏起来.在一个包中,定义一个类时,即使不加上访问权限关键词,这个类也是包内其他类可访问的,不

Java内部类:局部内部类(三)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节. 1.局部内部类的概念 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. class OutterClass { void test() { class InnerClass//局部内部类 { } } } 在上述代码中,InnerClass定义在OutterClass的test方法的内部

Java内部类:匿名内部类(四)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的匿名内部类,主要讲述匿名内部类的概念.匿名内部类的好处.匿名内部类的使用前提.和匿名内部类的应用场景. 1.匿名内部类的概念 没有类名的类就称作为匿名内部类 2.匿名内部类的好处 简化书写 3.匿名内部类的使用前提 必须存在继承或者实现关系才能使用 4.匿名内部类的应用场景 匿名内部类一般是用于实参 示例代码: package com.rk.innerclass; public cla

Java内部类小程序(成员内部类,静态内部类,匿名内部类)

1 /** 2 * 测试java内部类(成员内部类,静态内部类,匿名内部类) 3 * 局部内部类不常用,就不写了. 4 * @package :java05 5 * @author shaobn 6 * @Describe : 7 * @Time: 2015-9-6 下午8:32:38 8 */ 9 public class TestInner { 10 11 /** 12 * @author shaobn 13 * @Describe : 14 * @param args 15 * @Time

Java内部类的使用小结

内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后出现outer.class和outer$inner.class两类.所以内部类的成员变量/方法名可

java内部类和匿名内部类

内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . (2).内部类不能用普通的方式访问.内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 . (3).内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 . 成员内部类

Java内部类的继承

Java内部类的构造器必须连接到指向其外围类对象的引用(构造内部类必须给它一个外部类对象的引用,内部类依赖于外部类对象),所以在继承内部类的时候,需要在导出类的构造器中手动加入对基类构造器的调用. 因为,在导出类实例化时,并不存在一个外围类对象,以让导出类的实例去连接到它. 所以,我们需要创建一个外围类,然后用一个特定的语法来表明内部类与外围类的关系. 在下例子中,需要给导出类InheritInner一个来自内部类的外围类中的引用.普通的继承,只需在导出类构造器中加入super();,而内部类则

【转】Java 内部类种类及使用解析

Java 内部类种类及使用解析 内部类Inner Class 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类local inner class 匿名内部类anonymous inner class 静态内部类Static

Java内部类学习总结

目录 目录 概述 非静态内部类 从外部类的非静态方法中实例化内部类 从外部类的静态方法中实例化内部类 内部类的this引用 静态内部类 从外部类的非静态方法中实例化静态内部类 从外部类静态方法中实例化静态内部类 匿名内部类 方法内部类 概述 最近学习python,发现python是支持多继承的,这让我想起Java是通过内部类实现的这套机制.这篇文章不是讲如何通过内部类实现多继承,而是总结一下内部类的类型和使用方法. Java内部类分为: 非静态内部类 静态内部类 局部内部类 匿名内部类 内部类在