内部类是指一个外部类内定义的类。内部类分为有名内部类和匿名内部类。
1、有名内部类:有类名的内部类。
public class Boby{
class Heart{
void move (){
System.out.println("正在跳动......");
}
}//heart就是一个有名内部类,这个类名是“heart”。
}
关于有名内部类很简单不在赘述。
2、匿名内部类:没有类名的内部类。
同包的其中一个Body类:
public class Body {
public void move() {
System.out.println("爬行......");
}
}
注意:因为匿名类没有类名,无法在后续程序创建对象,所以需要在创建类时一起创建对象。
匿名内部类的方法:
new 父类构造器([参数列表])|接口(){
};
public class Heart{
Body body1 =new Body() {
@Override
public void move() {
System.out.println("跳动......");
}
};//匿名内部类的例子。
}
注意到匿名内部类中需要重写普通类(Body)的方法,所以匿名内部类(Heart)是普通类(Body)的子类。
如果将父类(Body)改为抽象类,此时发现如果父类(Body)中有两个抽象方法,匿名类只重写一个抽象方法时,匿名内部类会报错,又因为匿名内部类无法被继承,符合抽象类的子类中必须有一个子类完全重写了抽象类的全部方法。所以匿名内部类也是抽象类的子类。
因为抽象类中所有方法都是抽象方法,那么这个抽象类就是一个接口(interface)非常简单可以知道,匿名内部类是接口的实现类。
**思考:**上边说了,匿名类无法被继承,那么为什么不可以被继承?如果可以是抽象类,则该匿名类必须有子类,但是由于没有名字,所以没有子类,也就不能被继承。
**总结:**javac会给内部类生成一个独立class文件,编译之后,会生成一个被编译成独立的.class文件。
如图上图所示:
有名内部类命名:外部类名$内部类名.class
匿名内部类命名:外部类名$数字.class
访问权限:
作用:访问权限用于限制成员变量或方法能否在另一个类中被使用
1、外部类或外部接口 public 默认的;但是直接在类中定义的内部类,可以有public protected dafult private
2、如果在内部类中使用局部变量的值,则:JDK8.0及+可以不适用final修饰,8.0以前必须使用fianl
public void eat( String name) {//由于我使用的是JDK8.0+所以不需要+final修饰
class Heart{
{
System.out.println(name);
}
}
}
3、 由于局部变量已经被限定,所以局部变量不能使用访问权限。
4、private修饰的成员变量可以在内部类中使用,