学习Java第二十天--内部类之成员内部类

11.内部类与常用类

11.1 内部类

11.1.1 内部类的分类

  • 内部类分为四种:
    成员内部类
    静态内部类
    局部内部类
    匿名内部类

11.1.2 什么是内部类

  • 概念:在一个类的内部再定义一个完整的类
  • 特点:
    编译之后可生成独立的字节码文件;
    内部类可直接访问外部类的私有成员,而不破坏封装;
    可为外部类提供必要的内部功能组件;

11.1.3 成员内部类

  • 在类的内部定义,与实例变量、实例方法同级别的类;
  • 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象;
    Outer out = new Outer();
    Inter in = out.new Inner();
  • 当外部类、内部类存在重名属性时,会优先访问内部类属性;
  • 成员内部类不能定义静态成员;
public class TestInstanceInnerClass {

	public static void main(String[] args) {
		
		Outer out = new Outer();
		
		Outer.Inner in = out.new Inner();//特殊的创建方法,不具普适性
		
		in.m2();

	}

}
//类级别、对象级别
class Outer{
	
	private int a = 10;//外部类实例变量
	
	//实例方法
	public void m1() {}
	
	
	class Inner{//成员内部类
		
		public void m2() {
			
		}
	}
}

因为成员内部类的依赖于外部类的特殊性,如果没有外部类,那么就成员内部类就是“不可见”的,当你希望某部分方法只在一个特殊功能的类中被使用,那么就可以使用成员内部类进行定义,那么外界就无法使用这些方法。

成员内部类其实和正常的声明一个类并无多大差别,使用到的情况也很少,只要注意成员内部类不能定义静态成员,以及成员内部类依赖于外部类对象的特殊创建方法即可。

11.1.4 静态内部类

  • 不依赖外部类对象、可直接创建或通过类名访问、可声明静态成员;
  • 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
    Outer.Inner inner = new Outer.Inner();
    Outer.Inner.show();
public class TestStaticInnerClass {

	public static void main(String[] args) {
		
		System.out.println(Outer.Inner.b);//静态成员类的静态属性,可以通过类名.当方法访问
		
		Outer.Inner in = new Outer.Inner();//成员类的特殊new语法
		
		in.m2();
	}

}
class Outer{
	static int a = 10;
	
	//静态成员类
	static class Inner{
		static int b = 20;
		public void m2() {
			System.out.println(Outer.a);
			System.out.println("Inner m2()");
		}
	}
}

静态内部类就是用static修饰的成员内部类,通过static修饰为静态,该类的访问范围被扩大了,不再依赖于外部类对象。同样,这样静态内部类和普通的类的差别就更小了。所以一般很难有场景会使用到静态内部类。

发布了34 篇原创文章 · 获赞 7 · 访问量 1295

猜你喜欢

转载自blog.csdn.net/weixin_44257082/article/details/104563977
今日推荐