Java类的嵌套
之前我们所知道父子类的继承类,接下来先描述内部类与静态嵌套类二者的区别(是否被static修饰),接着就是static关键字的用法,然后由静态属性到普通常量,再从普通常量到枚举常量,进而阐述枚举类型的用法。
1. 内部类与静态嵌套类
1.1 内部类(非静态嵌套类)
通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,我们都要把其拆开成两个代码文件分别定义。但是某些事物相互之间有密切关系,又不同于父子类的继承关系,像树与花之间的依附关系,定义在一个类的成员类,俗称为“内部类”。
【代码】
//演示内部类的简单定义。这是一个树木类
public class Tree {
private String tree_name;
public Tree(String tree_name) {
this.tree_name = tree_name;
}
public void sprout() {
System.out.println(tree_name + "发芽啦");
// 外部类访问它的内部类,就像访问其它类一样,都要先创建类的实例,再访问它的成员
Flower flower = new Flower("花朵");
flower.bloom();
}
// Flower类位于Tree类的内部,它是个内部类
public class Flower{
private String flower_name;
public Flower(String flower_name) {
this.flower_name = flower_name;
}
public void bloom() {
System.out.println(flower_name + "开花啦");
}
}
}
内部类访问的注意点:
- 外部类访问内部类:先创建内部类的实例,再访问它的成员。(代码如上)
- 其他地方访问内部类:先创建外部类的实例,再基于该实例创建内部类实例。
内部类实例的创建代码格式 “ 外部类的实例名.new 内部类的名称(…) ”
【代码】
// 先创建外部类的实例,再基于该实例去创建内部类的实例
Tree tree = new Tree("杨树"); // 创建一个树木实例
tree.sprout(); // 调用树木实例的sprout方法
Tree.Flower flower = tree.new Flower("杨花"); // 通过树木实例创建内部类的花朵实例
flower.bloom(); // 调用花朵实例的bloom方法
- 内部类访问外部类:必须在this之前添加“外部类的名称”,即“ 外部类的名称.this ”
// 该方法访问外部类TreeInner的tree_name字段
public void bloomOuterTree() {
// 要想在内部类里面访问外部类的成员,就必须在this之前添加“外部类的名称.”
System.out.println(Tree.this.tree_name + "的" + flower_name
+ "开花啦");
}
1.2 静态嵌套类
在内部类的定义代码前面添加关键字static,表示这是一种静态的内部类,称为“静态嵌套类”,它无须强制绑定外部类的实例即可正常使用。
【代码】
public class TreeNest {
//演示静态嵌套类的定义
private String tree_name; // 树木名称
public TreeNest(String tree_name) {
this.tree_name = tree_name;
}
public void sprout() {
System.out.println(tree_name + "发芽啦");
}
// Flower类虽然位于TreeNest类的里面,但是它被static修饰,故而与TreeNest类的关系比起一般的内部类要弱。
// 为了与一般的内部类区别开来,这里的Flower类被叫做静