Java内部类:
内部类:
内部类是指在一个外部类内定义的类,按照是否有类名分为有名内部类和匿名内部类。全局有名内部类的使用方式类似于全局变量;局部有名内部类的使用方式类似局部变量——它们都有固定的使用范围。
有名内部类:
public class Body {
public class Heart{
public void beat() {
System.out.println("在跳动*******");
}
}
}
public static void main(String[] args) {
Body body = new Body();
//有名内部类实例化的方式
Heart heart = body.new Heart();
TestInnerClass tc = new TestInnerClass();
tc.callSomeBody();
}
有名内部类在实际中运用不多。
匿名内部类:
匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类,其语法格式如下:
Phone phone = new Phone() {
{
System.out.println("hello 匿名内部类!!");
}
@Override
public void telphone() {
System.out.println("Phone 的匿名内部类 中打电话!!");
}
};
首先结尾的花括号必须有分号,其中可以有代码块。
匿名内部类特点:
1.匿名内部类一定是接口的实现类(该实现类仅能实现一个接口)或类(普通类或抽象类)的子类,其中new 关键字后面的类名或接口名即是该匿名内部类继承的父类或实现的接口;
2.匿名内部类不能自定义构造方法,但是可以通过非静态代码块初始化成员变量;
3.匿名内部类一定不能是抽象类;
4.可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用。
Date date = new Date() {
private String getNowStrTime() {
DateFormat df = new SimpleDateFormat("yy/MM/dd HH:mm:ss SSS EEEE");
return df.format(new java.util.Date());
}
};
System.out.println("------------------>" + date.getNowTime());
上面的内部类中就不能实现getNowStrTime()中的方法,因为你可以发现这里是一个上转型对象。上转型对象只能重写父类中的方法,而不能调用新的方法。