Java系列以内部类

今天温习一下 Java 中的内部类,内部类通常有以下几种:静态内部类、成员内部类、匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容以下:java

  1. 概述
  2. 静态内部类
  3. 成员内部类
  4. 匿名内部类和方法内部类
  5. 总结

概述

顾名思义内部类就是在一个类内部定义的类,它是内部类是一个独立的类,编译以后会生成独立的 .class 文件,其名称前面会有外部类的类名称以及 $ 符号,内部类一样可使用 private 、default、protected、public 修饰,下面是内部类的写法,具体参考以下:微信

/** * 内部类 * @author jzman */
public class OutterClass {
	//静态内部类
	private static class StaticInnerClass{
		
	}
	//成员内部类
	private class FieldInnerClass{
		
	}
	
	//匿名内部类
	Runnable runnable = new Runnable() {
		@Override
		public void run() {
			
		}
	};
	
	private void method() {
		//方法内部类(局部内部类)
		class InnerClass{
			
		}
	}	
}
复制代码

静态内部类

  • 静态内部类能够有静态成员和非静态成员;
  • 静态内部类能够直接调用外部类的静态成员和静态方法,但不能调用外部类的非静态成员和非静态方法;
  • 在不相关类中,能够直接建立静态内部类的对象;
  • 静态内部类与其外部类联系不多,其建立基本不依赖与外部类。
/** * 静态内部类 * @author jzman */
public class StaticInnerClassDemo {
	public static void main(String[] args) {
		//其余类能够直接建立某个非私有内部类的实例
		OutterClass1.InnerClass innerClassB = new OutterClass1.InnerClass();
		InnerClass innerClassA = new InnerClass();
		innerClassA.testStaticInnerClass();
		//...
	}
}

//外部类
class OutterClass1{
	//非静态成员变量
	int ageA = 18;
	//非静态方法
	public void methodA() {
		
	}
	
	//静态成员变量
	static int ageB = 18;
	//静态方法
	public static void methodB() {
		
	}
	
	private void methodC() {
		//外部类调用静态内部类的方法
		InnerClass innerClass = new InnerClass();
		innerClass.testStaticInnerClass();
	}
	
	//静态内部类
	static class InnerClass{
		
		public void testStaticInnerClass(){
			//静态内部类不能访问其外部类的非静态成员变量和方法
// System.out.println(ageA);
// methodA();
			//静态内部类能够访问其外部类的静态成员和方法
			System.out.println(ageB);
			methodB();
		}
	}
}
复制代码

成员内部类

  • 成员内部类能够访问全部外部类的成员;
  • 成员内部类对象的建立必须依赖于外部类对象,先有外部类才会有内部类;
  • 成员内部类就是外部类的一个成员变量;
  • 成员内部类不能有静态成员,但容许常量存在。
/** * 成员内部类 * @author jzman */
public class FieldInnerClassDemo {
	public static void main(String[] args) {
		//成员内部类依赖与其外部类,不能越过外部类直接建立内部类的实例
// InnerClass innerClass = new InnerClass();
		//正确在其余类建立建立内部类的实例
		OutterClass2 outterClass2 = new OutterClass2();
		OutterClass2.InnerClass innerClass = outterClass2.new InnerClass();
		innerClass.testFieldInnerClassMethod();
	}
}

//外部类
class OutterClass2{
	//非静态成员变量
	int ageA = 18;
	//非静态方法
	public void methodA() {
		
	}
	
	//静态成员变量
	static int ageB = 18;
	//静态方法
	public static void methodB() {
		
	}
	
	private void methodC() {
		//外部类调用成员内部类的方法
		InnerClass innerClass = new InnerClass();
		innerClass.testFieldInnerClassMethod();
	}
	
	//成员内部类
	class InnerClass{
		
		//成员内部类不能有静态成员
// static int a = 10;
		//成员内部类容许常量形式存在
		static final int b = 10;
		
		public void testFieldInnerClassMethod(){
			//成员内部类能够直接访问其外部类的全部成员变量及方法(静态和非静态)
			System.out.println(ageA);
			methodA();
			System.out.println(ageB);
			methodB();
		}
	}
}
复制代码

匿名内部类和方法内部类

匿名内部类固然是没有肯定的名称,其实现都是在类体中具体实现,最终返回相关类的一个匿名对象,因为最终返回的是一个匿名的实例,因此必须在匿名内部类以后添加分号。方法内部类就是局部内部类,通常定义在类的局部位置,它能够访问当前代码块及外部类的全部变量。ide

总结

类之间的成员变量的互相调用实际上仍是访问对象的成员变量,如成员内部类可以访问外部类的成员变量或方法是由于内部类持有外部类的引用,通常经过 OutterClass.this 获取外部类的对象,若是外部类想要访问内部类的成员变量或方法固然也须要持有内部类的引用,因此外部类访问内部类的成员变量或方法时,必须先建立内部类的对象,而后经过对象来方位相应的成员变量或方法。学习

能够选择关注微信公众号:jzman-blog 获取最新更新,一块儿交流学习! this

jzman-blog
相关文章
相关标签/搜索