Java内部类基础知识

内部类是定义在另一个类中的类。为什么需要使用内部类呢?其主要原因有以下三点:1、内部类方法可以访问该类定义所在的作用域中数据,包括私有的数据。2、内部类可以对同一个包中的其他类隐藏起来。3、当要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

内部类(inner class)是定义在另一个类中的类。在实际工作中内部类使用得非常广泛,特别是匿名内部类。

为什么需要内部类?

(1)内部类方法可以访问该类定义所在的作用域中数据,包括私有的数据。如下:

package innerClass;

public class InnerClassTest01 {
        // 类的私有数据
	private String name = "InnerClassTest01";
	
	public static void main(String[] args) {
		// 创建实例
		InnerClassTest01 t = new InnerClassTest01();
		// 创建内部类实例
		Inner01 inner01 = t.new Inner01();
		inner01.show();
	}
	
	class Inner01 {
		private int age = 20;
		public void show() {
			// name=InnerClassTest01 age=20
			System.out.println("name=" + name + " age=" + age);
		}
	}
}

(2)内部类可以对同一个包中的其他类隐藏起来。如上的Inner01内部类对于非innerClass包来说是不可见的。如:

package innerClass;
public class InnerClassTest01 {
    ...
    class Inner01 {
        ...
    }
}

package test;
public class Test {
    public static void main(String[] args) {
        // 下面的语法是错误的
        // Inner01 inner = new Inner01();
    }
}

(3)当要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。如下面通过线程的方式打印0~9数字:

public class InnerClassTest02 {
	
	public static void main(String[] args) {
	        // 匿名内部类
		new Thread(new Runnable() {
			private int i = 0;
			@Override
			public void run() {
				while ( i < 10 ) {
					System.out.println( "i = " + (i++) );
				}
			}
		}).start();
	}
}

其中直接实现Runnable接口,通过匿名内部类的方式来实现的。

内部类的语法规则

(1)OutterClass.this语法

在内部类中可以使用上面这种语法访问外围类的数据。如下:

package innerClass;

public class InnerClassTest03 {
	private String name = "hello world";
	
	public static void main(String[] args) {
		InnerClassTest03 test = new InnerClassTest03();
		
		// 创建内部类
		Inner inner = test.new Inner();
		inner.show();
		
		test.t();
	}
	
	public void t() {
		// 创建内部类
		Inner inner = new Inner();
		inner.show();
	}
	
	class Inner {
		public void show() {
			System.out.println("name = " + InnerClassTest03.this.name);
		}
	}
}

其中InnerClassTest03.this.name使用了OutterClass.this的方式访问外围类name属性。

(2)outerObject.new语法

使用该语法来创建内部类,如下:

class Inner {
	public void show() {
		System.out.println("name = " + InnerClassTest03.this.name);
	}
}

(3)OutterClass.InnerClass

其他类可以使用该方式访问指定类的内部类。如下:

package innerClass;

public class InnerClassTest04 {
	public static void main(String[] args) {
		InnerClassTest03.Inner inner = (new InnerClassTest03()).new Inner();
		inner.show();
	}
}

这里在InnerClassTest04类中通过此种语法访问了InnerClassTest03类的Inner内部类。

青年最主要的任务是学习。 —— 朱德
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号