09-嵌套类
嵌套类:定义在另一个类中的类
public class OuterClass {
// 静态嵌套类
static class StaticNestedClass {
}
// 非静态嵌套类(内部类)
class InnerClass {
}
}
在嵌套类外层的类,称为外部类(outerclass)
在最外层的外部类,称为顶级类(Top-level class)
内部类-InnerClass
内部类:没有被static修饰的嵌套类,非静态嵌套类;
跟实例变量、实例方法一样,内部类与外部类的实例相关联;
- 必须先创建外部类实例,然后再用外部类实例创建内部类实例;
- 内部类不能定义除时常量以外的任何static成员;
内部类可以直接访问外部类中的所有成员(即使被声明为private)
外部类可以直接访问内部类实例的成员变量、方法(即使被声明为private)
package com.mj.InnerClass;
public class Person {
private int age;
public int getAge() {
return age;
}
public class Hand {
}
}
package com.mj.InnerClass;
import com.mj.InnerClass.Person.Hand;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person person = new Person();
Hand hand = person.new Hand();
}
}
内存分布

内部类举例

静态嵌套类(Static Nested Class)
静态嵌套类:被static修饰的嵌套类;
静态嵌套类在行为上就是一个顶级类,只是定义的代码写在了另一个类中;
对比一般的顶级类,静态类多出了一些特殊权限;
- 可以直接访问外部类中除实例变量、实例方法外的其他成员(即使被声明为private)
什么情况使用嵌套类?
如果类A只用在类C内部,可以考虑将类A嵌套到类C中;
- 封装性更好;
- 程序包更加简化;
- 增强可读性、可维护性;
如果类A需要经常访问类C的非公共成员,可以考虑将类A嵌套到类C中;
- 另外也可以根据需要将类A隐藏起来,不对外暴露;
如果需要经常访问非公共的实例成员,设计成内部类(非静态嵌套类),否则设计成静态嵌套类;
(能静态,尽量静态)
如果必须先有C实例,才能创建A实例,那么可以将A设计为C的内部类;

浙公网安备 33010602011771号