- public class Cow {
- private double weight;
- // 外部类的两个重载的构造器
- public Cow() {
- }
- public Cow(double weight) {
- this.weight = weight;
- }
- // 定义一个非静态内部类
- private class CowLeg {
- // 非静态内部类的连个Field
- private double length;
- private String color;
- // 非静态内部类的两个重载的构造器
- public CowLeg() {
- }
- public CowLeg(double length, String color) {
- this.length = length;
- this.color = color;
- }
- public void setLength(double length) {
- this.length = length;
- }
- public double getLength() {
- return this.length;
- }
- public void setColor(String color) {
- this.color = color;
- }
- public String getColor() {
- return this.color;
- }
- public void info() {
- System.out.println("当前牛腿颜色是:" + color + " 高" + length);
- // 直接访问外部类的private修饰的Field
- System.out.println("本牛腿所在奶牛重:" + weight);
- }
- }
- public void test() {
- CowLeg cl = new CowLeg(1.12, "黑白相间");
- }
- public static void main(String[] args) {
- Cow cow = new Cow(378.9);
- cow.test();
- }
- }
复制代码 看这段代码执行时的内存分布图:这是我从一本资料上面截图下来的
CowLeg这个内部类是在test()方法内部被初始化,如果我们把Cow.test()注释掉,即java编译器不会为test()方法来单独开辟一个栈区来保存指向test()的引用,换句话说就是test()方法体里面的代码都没有执行,那何来CowLeg的对象呢?当一个对象被创建的时候,与这个对象相关的仅仅是Field(就是构造方法前的初始化块),和构造方法体里面的代码会在堆内存中得到一份拷贝,同时构造方法返回指向这个对象的引用。而与这个类相关的方法,是不会与对象一起被初始化的,除非你把CowLeg这个类的对象的创建放在了构造方法或者说是Field里面,那么毫无疑问,CowLeg的对象肯定会随着Cow类对象的创建而创建。不知道我这么说你有没有理解,我不保证我理解的就是对的。。。但是一起思考吧。。。
|