天天看点

小白成长记——Java基础之内部类

定义:

在一个类的类体之内再定义一个类,该情况下外面的类称为“外部类”,里面的类称为“内部类”

引入内部类的主要原因:

·内部类能够隐藏起来,不为同一包的其他类访问;

·内部类可以访问其所在的外部类的所有属性;

·再回调方法处理中,匿名内部类尤为便捷,特别是事件处理经常使用

内部类的分类:

1).成员内部类:在“外部类”的内部定义一个类 示例:

public class test {
	private double weight;

	public test(double weight) {
		this.weight = weight;
	}

	private class init {
		private double height;

		public init(double height) {
			this.height = height;
		}

		public void display() {
			System.out.println("高度是:" + height + ", 宽度是:" + weight);
		}
	}
}
           

test为外部类,init为内部类,可以直接访问外部类的成员变量

2).局部内部类:在方法中定义的内部类称为局部内部类 注意点:

·局部内部类不能用public或private访问修饰符进行声明

·局部内部类作用域被限定在声明该类的方法块中

·局部内部类的优势在于,它可以对外界完全隐藏起来,除了所在的方法之外,对其他方法而言是不透明的

·局部内部类不仅可以访问包含它的外部类的成员,还可以访问局部变量,但这些局部变量必须被声明为final 示例:

public static void main(String[] args) {
		// 创建局部内部类
		class Inner {
			int a;
		}
		// 创建局部内部类的子类
		class InnerSon extends Inner {
			int b;
		}
		// 创建局部内部类的对象
		InnerSon is = new InnerSon();
		is.a = 5;
		is.b = 6;
		System.out.println("a的值为:" + is.a + ", b的值为:" + is.b);
	}
           

在实际开发中很少使用局部内部类,因为作用域太小,只在本方法中有用。 3).静态内部类:使用static关键字修饰一个内部类,则该内部类称为“静态内部类” 静态内部类属于外部类本身,而不属于外部类的某个对象 示例:

public class test {
	private int a = 5;
	private static int b = 6;

	static class Inner {
		// 静态内部类可以包含静态成员
		private static int c = 7;

		public void display() {
			// 出现错误,静态内部类不能访问外部类的示例变量
			System.out.println(a);
			// 可以访问外部类的静态变量
			System.out.println(b);
		}
	}
}
           

静态内部类只能访问外部类的静态变量

4).匿名内部类:匿名内部类就是没有名字的内部类,匿名内部类适合只需要使用一次的类,当创建一个匿名类时会立即创建该类的一个实例,该类的定义会立即消失,不能重复使用 示例:

public static void main(String[] args) {
		System.out.println(new Object() {
			public String toString() {
				return "匿名内部类";
			}
		});
	}