Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!
Java里有各种各样的类、例如内部类、本地类、局部类、静态类、、、、其实有些指的是一个/只不过在英文翻译成中文时采用的意思不同,这让我想起我的弟弟在阅读鲁滨逊漂流记时 问我 这个主人公到底叫什么 我告诉这位六年级的小朋友 他叫Robinson 只不过不同的译者翻译不同 你可以叫他鲁滨逊、鲁宾逊、鲁宾孙、罗宾森、、、好回到正题
一、直接***
总结
- 一个 .java 文件内有且仅有一个 public 修饰的类也就是主类而其他不能用不能用public修饰的也不再类里面的就叫做 “文件类”(例如下面的 classD)这种文件类和主类关系最小(所以你很少听到这个名词)
public class Main{// 只能放public abstract final这三种修饰符
}
class TestD {
// 文件类默认只能是包访问权限,即:不是同一个包的是无法引入和使用的。
// 默认是default-另外三种访问修饰符不可用
}
- 上面是类外面的类,反之,嵌套类,定义在类里的任意地方
嵌套类是一个宽泛的概念(下面继续细分)
它可以根据static 关键字的有无 分为 静态嵌套类、非静态嵌套类
// 静态类的实例不需要先实例化外部类成员,可直接实例化。
//对于上面加粗黑体字解释
public class TestC {
static class TestC11 {}
class TestC22 {}
public static void main(String[] args) {
TestC11 t11 = new TestC11();//静态类的实例化
TestC c = new TestC();
TestC22 t22 = c.new TestC22();//非静态的实例化--现实例化外部类
}
public class Main{
// 1.静态嵌套类(static)==四种访问修饰符均可用,但官方给黄色警告
// -The type TestC.TestC1 is never used locally---
static class TestC1 {
//这不就是静态内部类吗,这种类确实,形式上是在一个类里面,应该给他一个内部类的名分
}
}
- 相对于里面的嵌套类,外面的类就是外部类(即上面的Main)
- 静态嵌套类其实就是 广义上的内部类之一的静态内部类 这种类你可以理解为相当于一个类的静态成员
故不能在静态嵌套类里访问外部类的非静态的东西 - 非静态嵌套类就是狭义上的内部类( 成员内部类、局部内部类、匿名内部类。)
- 他们三位内部类共有的特性
内部类中不能有静态static修饰的成员(比如代码块、字段、方法、接口等),总之不能有static关键字,除了一种情况可以有,那就是静态常量,
public class TestC {
// 此处以成员内部类为例
public class TestC2 {// 四种访问修饰符均可使用
// The method t1 cannot be declared static; static methods can only be declared in a static or top level type
//static void t1() {}
//Cannot define static initializer in inner type TestC.TestC2
// static {}
static final int a = 10;
}
}
- 局部内部类亦是局部嵌套类,是定义在代码块中、方法中、构造器中,局部类只在本块(也就是最近的一对大括号内{})范围内有效。abstract、
final可以修饰局部内部类 - 成员内部类对于那四种修饰符(public /protected/default/private)都是可用的,位于类内 但不位于块内方法内,不然成为局部内部类
- 匿名类,没有名称的类,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有构造器
2.细枝末节
匿名类不能使用任何关键字和访问控制符,匿名类和局部类访问规则一样,只不过内部类显式的定义了一个类,然后通过new的方式创建这个局部类实例,而匿名类直接new一个类实例,没有定义这个类。匿名类最常见的方式就是回调模式的使用,通过默认实现一个接口创建一个匿名类然后,然后new这个匿名类的实例。/ / (在执行实例内部类的方法时)当 实 例 ( 成 员 ) 内 部 类 拥 有 和 外 部 类 同 名 的 成 员 变 量 或 者 方 法 时 , / / 会 发 生 隐 藏 现 象(有点类似 就近原则) , 即 默 认 情 况 下 访 问 的 是 成 员 内 部 类 的 成 员 : / / 如 果 要 访 问 外 部 类 的 同 名 成 员 , 需 要 以 下 面 的 形 式 进 行 访 问 : / / 外 部 类.this. 成 员 变 量 / / 外 部 类.this.成 员 方 法
匿名 内 部 类 适 合 创 建 那 种 只 需 要 一 次 使 用 的 类 , / / 定 义 匿 名 内 部 类 的 语 法 格 式 如 下 : / / new 父 类 构 造 器 ( 实 参 列 表 ) | 实 现 接 口 (){ / / 匿 名 内 部 类 的 类 体 部 分 } / / 从 定 义 格 式 可 看 出 , / / 匿 名 内 部 类 必 须 继 承 一 个 父 类 , 或 实 现 一 个 接 口 , / / 但 最 多 只 能 继 承 一 个 父 类 , 或 实 现 一 个 接 口 。 (有且仅有1个) / / 匿 名 内 部 类 两 条 规 则 : / / 1 . 不 能 是 抽 象 类 。 / / 2 . 不 能 定 义 构 造 方 法 。 / / 由 于 匿 名 内 部 类 没 有 类 名 , 所 以 无 法 定 义 构 造 器 , / / 但 匿 名 内 部 类 可 有 初 始 化 块 ( 代 码 块 ) , / / 可 以 通 过 初 始 化 块 来 完 成 构 造 器 需 要 完 成 的 工 作 。