数据类型与静态检查
1
在Java中,数据类型分为基本数据类型(int、boolean、char等)和对象数据类型(String、Integer等)。所有的基本数据类型都是Immutable的,而且在栈中分配内存,代价也比较低。而对象数据类型有的是Immutable的,有的是Mutable的,分配的内存都在堆中,代价相对昂贵。因此在能使用基本类型的情况下尽量使用基本数据类型,降低代价。
对象数据类型是OOP的核心,由于对象数据类型存在继承(extends)机制,因此在OOP中可以更好的复用代码。
基本类型被包装为对象类型,通常只有在定义集合的时候使用,其他情况下尽量避免使用。基本类型和对象类型之间一般可以自动转换。
静态类型语言(Java)可执行静态类型检查,在编译阶段进行类型检查,这意味着避免了将错误带入到运行阶段,可以提高程序的正确性/健壮性,例如语法错误、类名/函数名错误,参数类型或数目错误、返回值类型错误都可以在静态类型检查时发现;动态类型语言(python)只有动态类型检查,在运行阶段才会进行类型检查,例如非法的参数值 (最典型的NULL引用)、非法的返回值、越界等等。
静态类型检查是关于数据类型的检查,它不会关心具体的值,而动态类型检查是关于值的检查。
例如int n=1.1在静态类型检查的时候就会报错,但double a=0; double b=2/a;只有在运行之后,执行动态类型检查的时候才会报告除零错。
接口、继承和重写
接口可以实现静态方法,使用 static 关键字。
通过static关键字可以实现静态工厂方法,从而将接口的实现类封装,实现对外信息隐藏。
接口中也允许使用 default 关键字来定义并实现实例方法,这个应用有点类似于抽象类的功能。
通过default方法,在接口中统一实现某些功能,无需在各个类中重复实现它。
子类可以继承父类的数据域和方法。
严格继承:子类只能添加新方法,无法重写超类中的方法。原因:父类中的方法使用了final关键字限定。
重写:子类的方法覆盖了父类的方法。重写的方法应该与父类方法有相同的签名,只有这样编译器才会判定为重写的方法。使用@Override annotation强制检查是否重写了超类中的方法。