java——匿名内部类

匿名内部类:
实际上就是内部类的简写方式。
前提:
存在一个类或者接口。
这里的类可以是具体类也可以是抽象类。


格式:
new 类名或者接口名(){//注意本质代表的是:继承了该类或者实现了该接口的子类匿名对象。
    重写方法;
}

new的目的是在内存中分配内存,创建对象。

本质:
是一个继承了该类或者实现了该接口的子类匿名对象。


案例:
定义一个接口:
package com.haust.day10.demo8;


public interface Inter {
	public abstract void show();
	public abstract void show2();
}


Outer类:
package com.haust.day10.demo8;


public class Outer {
	public void method(){
		//创建一个匿名内部类
		//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
		new Inter(){


			public void show() {
				System.out.println("show");
				
			}


			public void show2() {
				System.out.println("show2");
				
			}
			
		}.show();//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
		new Inter(){


			public void show() {
				System.out.println("show");
				
			}


			public void show2() {
				System.out.println("show2");
				
			}
			
		}.show2();//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
		
	}


}


入口类:
package com.haust.day10.demo8;


public class Main {


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();


	}


}
输出:
show
show2


由于调用两个show方法时候显得程序臃肿,而且若是有大量方法调用时这种方法不可取,顾可简化。
思考,前面我们说了,匿名内部类的实质就是继承该类或者实现了该接口的的子类匿名对象。所以我们可以把这个匿名内部类赋值给父类(接口)---也就是我们说的多态实现。


package com.haust.day10.demo8;


public class Outer {
	public void method(){
		//创建一个匿名内部类
		//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
		Inter i = new Inter(){//实现多态


			public void show() {
				System.out.println("show");
				
			}


			public void show2() {
				System.out.println("show2");
				
			}
			
		};//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
		i.show2();
		i.show2();
	}


}




匿名内部类在开发中的应用:
案例:
Person接口
package com.haust.day10.demo9;


public interface Person {
	public abstract void study();


}
Student实现类:
package com.haust.day10.demo9;


public class Student implements Person{


	public void study() {
		System.out.println("我们要好好学习!");
	}


}
PersonDemo类:
package com.haust.day10.demo9;


public class PersonDemo {
	public void method(Person p){
		p.study();
	}


}


入口类:
package com.haust.day10.demo9;


public class Main {


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//创建对象
		PersonDemo pd = new PersonDemo();
		Person p = new Student();//实现多态
		pd.method(p);
       /*
        * 思考:这是我们之前熟悉的写法,结合今天的匿名内部类学习知识
        * 我知道了匿名内部类的实质就是继承该类或者实现了该类的接口的匿名对象
        * 所以我们可以用匿名内部类方法来改写以上代码
        * */
		pd.method(new Person(){
			public void study() {
              System.out.println("study hard!");
			}
		});
	}
      /*
          这种代码方式不如第一种方式好理解,但是简练,
          而且在安卓里经常使用,因为匿名内部类用完就是“垃圾”,
          没有栈内存指向其,所以在手机端开发经常使用。
      */


}
输出:
我们要好好学习!
study hard!

面试题:
按照要求补齐代码:
interface Inter{void show();};
class Outer{//代码}
class OuterDemo{
   public static void main(String args[]){
   Outer.method.show();
   
   }
}
//在控制台输出hello world!
分析:
    Outer直接调用method说明在Outer中有一个静态的method()方法,接着调用show方法说明method方法返回的是一个Inter类型的接口对象(因为调用了show方法)。
所以:
package com.haust.day10.demo10;


public interface Inter {
     public abstract void show();
}
Outer类:
package com.haust.day10.demo10;


public class Outer {
     public static Inter method(){
    	return new Inter(){
    		public void show(){
    			System.out.println("hello world!");
    		}
    	};
    }
}
入口类:
package com.haust.day10.demo10;


public class Main {


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Outer.method().show();


	}


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值