java内部类基础匿名类(二)

1.内部类不止可以直接放在类里还可以放在方法和作用域中,说是被称为局部内部类。。。

2.局部内部类的只能用在局部的作用域中,所以外面的类如果用了这个类名是不会命名冲突的。

3.局部内部类是和别的类一起编译过的,并不是有条件的编译。


下面主要介绍匿名内部类:

栗子:

interface Destination
{
	String getLabel();
} 
public class Parce
{
	public Destination getDestination(final String dest, final float price){
		return new Destination(){
			private int cost;
			{//实力初始化
				cost = Math.round(price);
				if(cost > 100)
					System.out.println("Over budget!");
			}
			private String label = dest;
			public String getLabel(){
				return label;
			}
		};
	}
	public static void main(String[] ags){
		Parce p = new Parce();
		Destination d = p.getDestination("China",103.232f);
	}
}
先介绍方法Math.round()。是一个四舍五入方法,输出整数。如1=1.4f;2 = 1.5f;2 = 1.6f;-1 = -1.5f。

1.你会发现上面是一种奇怪的语法,它其实是“创建一个继承Destination的匿名类的对象”。一般Destination可以是类或接口。

2.匿名类没有自己的名字,所以没有构造器,那如果初始化对象是想要初始化参数怎么办呢?其实上面的栗子中已经给出了解决方法:cost的定义下面的大括号中的就是初始化参数的过程,相当于构造器。

3.如果匿名类想用外部的参数,可以在方法中传进来,但必须是final类型的,这个上面栗子也已经有了。dest和price就是这样的。但如果传进来的参数不是匿名类要用的,那就不必是final类型了。如下面这个dest参数只是为了让基类用的:

class Destination
{
	String dest;
	public Destination(String dest){
		this.dest = dest; 
	}
	public void readDest(){
		System.out.println(dest);
	}
} 
public class Parce1
{
	public Destination getDestination(String dest, final float price){
		return new Destination(dest){
		};
	}
	public static void main(String[] ags){
		Parce1 p = new Parce1();
		Destination d = p.getDestination("China",103.232f);
		d.readDest();
	}
}
  此处想提醒自己一个错误,向上转型后的引用当然不可再调用子类中方法。

4.由上面的栗子可以轻易的总结出,匿名类的实例初始化方法不能重载(木有名字啊哈哈)。

5.与普通继承的不同之处:可以扩展类可实现接口但不能两者兼具,且接口也只能是一个接口(啊哈哈哈,傻子都看粗来了)

你可能感兴趣的:(java,匿名类)