不同含义的类

内部类与匿名类

在类的内部中定义的类,称为内部类,例如,在 A中定义了一个类 B,类B就是 A 的内部类。
内部类可以直接访问外部类的成员,包括私有。外部类要访问内部类的成员必须创建对象。内部类相当于外部类的一个成员。

内部类的四种形式:

  • 成员内部类; 在类体内定义的类, 其与成员变量一样,属于类的全局成员。
  • 局部内部类: 在类的方法内定义的类,其与局部变量一样,属于类的局部成员。
  • 静态内部类: 使用 static 关键字修饰的内部类, 其与静态成员变量一样,可以在类中直接引用。
  • 匿名内部类: 没有名称的类, 称为匿名类,是一种特殊的内部类。 使用匿名内部类可以使代码更加简洁、紧凑,模块化程度更高。 算是一种常简化代码的应用。匿名内部类有两种实现方式:第一种, 继承一个类,重写其方法; 第二种,实现一个接口(可以使多个),实现其方法。

匿名类的特点

匿名内与其他类不同就在于匿名,也就是没有名称。 Java中允许创建子类对象时,除了使用父类的构造方法外,还可以使用类体,匿名类就是一个没有类声明的类体,因为没有名称,所以匿名类不可以声明对象,但可以创建对象。

匿名类的特点:

  • 匿名类是一个子类,可以继承父类的方法也可以重写父类的方法。
  • 匿名类可以访问外嵌类中的成员变量和方法,但在匿名类中不能声明静态变量和静态方法。
  • 使用匿名类时,必须在某个类中直接使用匿名类创建对象。
  • 使用匿名类创建对象时,要直接使用父类的构造方法。
  • 匿名类主要用来创建接口的唯一实现类,或者创建某个类的唯一子类。

创建匿名类的格式: new< 类名 > {匿名类的类体}

	public class Demo1{   //主类
		public static void main(String[] args) {
			Demo1 nm = new Demo1();
			nm.show();
			
		}
	private void show() {        //在这个方法中构造了一个匿名内部类, 即类Demo1中又定义了一个类
		Out out1 = new Out() {
			void show() {
				System.out.println("这是创建的匿名类。");
				super.show(); 
			}
		};
	out1.show();
	}
	class Out{
		void show() {System.out.println("这是匿名类的父类。");}}
}

注意这段代码

Out out1 = new Out(){
	void show() {
		System.out.println("这是创建的匿名类。");
		super.show();
		}
	};

这段是两个功能的组合,首先是类的建立(这个类没有名字)

Out(){
void show(){
	System.out.println("这是创建的匿名类");
	super.show();
	}
};

因为匿名类没有名字,所以extends , implement这些也就不需要了。
第二部分是 实例对象的创建,实例对象是匿名类的对象。

Out out1 = new Out() {}

中括号之间就是刚才类名的定义, 发现问题了吗? out1 指定了匿名类的父类,但是用匿名类来实例化,这其实是一个向上转型的例子,这就是匿名类的好处,对于向上转型的例子,如果某些子类的存在是一次性的,即只是为了向上转型而用,这时候使用匿名类可以使代码更简洁。

发布了202 篇原创文章 · 获赞 4 · 访问量 4233

猜你喜欢

转载自blog.csdn.net/qq_44587855/article/details/103844703