public interface IMammal {
void eat();
}
//普通外部类、抽象类、接口只能被public和default修饰,都可以有内部类
public class Body {
//有名内部类
class Heart{
}
/* 内部类可直接定义在类中,但匿名内部类由于要创建对象故只能在方法或代码块中定义
* 内部类类似于成员变量可以被四种访问权限修饰,甚至是static修饰
* 内部类可以访问外部类所有访问权限的成员变量
* 在编译后会被编译成独立的.class文件,
* 文件名为外部类名+$+内部类名(匿名内部类+数字)
*/
public static void main(String[] args) {
/* 匿名内部类 匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类
* 匿名内部类一定是接口的实现类(该实现类仅能实现一个接口)或类(普通类或抽象类)的子类
* 其中new 关键字后面的类名或接口名即是该匿名内部类继承的父类或实现的接口;
*/
new IMammal() {
//语法:new 父类构造方法(参数列表)|接口(),因为没有类名->不能创建对象->不能是抽象类、不能自定义构造方法
@Override
public void eat() {
System.out.println(1);
}
};
new IMammal() {
public void swim() {
System.out.println("swimming");
}
@Override
public void eat() {
System.out.println(2);
}
}.swim();//新创建的方法或属性只能被非上转型对象方式创建的匿名内部类对象所调用,如下
IMammal mammal = new IMammal(){
public void swim() {
System.out.println("swimming");
}
@Override
public void eat() {
System.out.println(2);
}
}.swim();//不能调用
}
public void print(final String name) {//由于局部变量name要在InClass内部类中使用,所以需要加final
final int weight = 9;//由于局部变量weight要在InClass内部类中使用,所以需要加final;
class Man{
{
System.out.println(name + weight);
}
}
new InClass().print();
}//从 Java 8开始,如果定义的内部类需要使用该局部变量,则该变量可以不使用final修饰。
}
详述有名内部类与匿名内部类
最新推荐文章于 2020-04-03 20:44:05 发布