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的内部类;

局部类(Local Class)

posted @ 2021-08-14 18:22  贝克曼  阅读(55)  评论(0)    收藏  举报