欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 匿名内部类

程序员文章站 2022-06-07 16:46:41
...
匿名内部类的结构有以下2种:
new interfacename(){......};
new superclassname(){......};

需要注意的地方:
     匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:
    1,如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
    2,将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
    3,在这个匿名内部类中使用初始化代码块

使用内部类的优点:
    1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。
   2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。
  3.匿名内部类可以很方便的定义回调。
  4.使用内部类可以非常方便的编写事件驱动程序。

例子:
    一个Animal接口
   
    public interface Animal {
        public String getCry();
	public String getName();
    }
    

    一个Dog类
  
   public class Dog {
   
	private String name;
	
	public Dog(String str){
		this.name=str;
	}
	public String getDogName(){
		return this.name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
   }
   

   测试类
  
   public class AnonymousTest {

	private String x="喵喵~~";
	private String y="cat";
	
	public static void main(String[] args) {
		AnonymousTest t=new AnonymousTest();
		Animal animal=  t.CreateAnimalByInterface();
        
		System.out.println(animal.getCry());
		System.out.println(animal.getName());
		
		Dog d=t.CreateAnimalByClass("boyu");
		System.out.println(d.getDogName());
	}
   
	
	public Animal CreateAnimalByInterface(){
		
		//new interfacename(){......};
		return new Animal(){
			
			//任何外部类都无法条用该方法,除非在接口或继承类中实现
			public String top(){
				String top="匿名类内参数~~";
				return top;
			}
			
            @Override
			public String getCry() {
				
				return getX();
			}
            @Override
			public String getName() {
				
				return getY();
			}
			
		};
	}

  public Dog CreateAnimalByClass(String x){
		
		// new superclassname(){......};
		return new Dog(x){
			@Override
			public void setName(String str) {
				super.setName(str);
			}
			@Override
			public String getDogName() {
				return super.getName();
			}
			
		};
	}



	public String getX() {
		return x;
	}

	public void setX(String x) {
		this.x = x;
	}

	public String getY() {
		return y;
	}

	public void setY(String y) {
		this.y = y;
	}
   
}