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