java匿名内部类详述

匿名内部类区别用于有名内部类,区别在于匿名内部类没有类名。因此匿名内部类必须和创建对象一起存在。
因为匿名内部类的特殊性,则匿名内部类创建的对象一定是普通类或抽象类的子类,接口的实现类对象。
匿名内部类命名格式:

 new 父类构造器([参数列表])|接口(){
  	//匿名内部类类体
  };

实例:

package 内部类

public class Mammal{

	public void move(){
	System.out.println("移动中。。。。。。");
	}
}
package 内部类

public class Test{
	Mammal mammal = new Mammal(){
		@Override//子类重写了父类的方法
		public void move(){
			System.out.println("爬行。。。。。。");
		}
	};//现在就创建了一个匿名内部类,是Mammal这个父类的子类,而且没有名字。( } 后面有个分号;)
}

也可以这么创建:

	new Mammal(){
		@Override
		public void move(){
			System.out.println("爬行。。。。。。");
		}
	};

内部类中也可以添加其他方法:

package 内部类

public class Test{
	Mammal mammal = new Mammal(){
		@Override
		public void move(){
			System.out.println("爬行。。。。。。");
		}
		public void stand(){
			System.out.println("双腿站立。。。。。。");
		}
	};
}

stand是新增的,当调用方法时,无法调用stand方法。
所以匿名内部类常用于重写父类或者接口中的方法,当然也可以定义新的属性和方法,但此时该方法的上转型对象无法调用。
那如何调用:

package 内部类

public class Test{
	Mammal mammal = new Mammal(){
		@Override
		public void move(){
			System.out.println("爬行。。。。。。");
		}
		public void stand(){
			System.out.println("双腿站立。。。。。。");
		}
	}.stand();//此时调用了stand方法。
}

这样单纯调用stand方时,改写的方法(上转型对象)就无效了。
因为上转型对象不能调用子类新增方法!!!!
所以匿名内部类常用于重写父类或者接口中的方法,而不是创建新的方法和属性。

不同内部类对生成的class文件的差异 。
有名内部类编译后生成外部类$内部类.class文件。

匿名内部类编译后生成外部类$数值.class文件。

发布了28 篇原创文章 · 获赞 0 · 访问量 426

猜你喜欢

转载自blog.csdn.net/syhfly2333/article/details/105200500