java温习*(23):关于内部类的常见问题

1、方法内部类中为什么不能有静态成员?

由于static类型的属性和方法,在类加载的时候就会存在于内存中。因此要想使用某个类的static属性和方法,那么这个类必须要先加载到虚拟机中。但是,普通的方法内部类并不会随外部类一起加载,只有在实例化外部类之后才会加载。因此,如果在外部类并没有实例化,内部类还没有加载的时候,直接调用内部类的静态成员或方法,这明显是矛盾的。所以普通的方法内部类不能有静态成员变量或静态方法。

2**、为什么方法中返回值是Object,返回的是方法调用还不报错?**java温习*(23):关于内部类的常见问题

这里并不是返回方法调用,而是返回内部类Heart对象的beat方法的返回结果,整个方法最后一句的执行顺序是:1、通过new实例化内部类对象
2、调用其beat方法
3、将beat方法返回值通过return带回,也就是此时的Object返回值

此处,也因为Object是Java中的根类,基于向上转型的原则,可以返回具体的子类String类型的对象。

3、什么是方法签名?

在Java中,方法签名着重指代:方法名和参数列表(包括:参数的类型、个数以及顺序)。

譬如:下图所示代码中方法签名即为:

exam(String,Teacher,double),可不考虑返回值与访问修饰符

java温习*(23):关于内部类的常见问题

4、课程中如下图代码,为什么要写getRead( )方法,都直接写main方法里不行么?

java温习*(23):关于内部类的常见问题

将功能拆分成方法,而不是都写死在main方法中,一方面可以多角度体现不同方式对象传参的应用;另一方面实际开发中也更推荐按功能合理拆分,以便于后续扩展维护。

5、前面不是讲过接口和抽象类不能直接实例化,为什么课程中(如下图1,2)可以这么写?

java温习*(23):关于内部类的常见问题(图1)

java温习*(23):关于内部类的常见问题​(图2)

此处并不是实例化Person,大家可以理解为我们是创建了一个没有名字的Person类型的子类对象,如下图3中代码与图2中功能是一致的。

java温习*(23):关于内部类的常见问题(图3)