Java所有继承均为公有继承(c++有私有继承和保护继承)
子类功能更加丰富,父类方法不适用时需要覆写改方法(super.getSalary+...)
super不是对象的引用,只是一个指示编译器调用父类方法的特有关键字(c++中采用父类::方法名调用父类方法)
super(n,s...)调用父类的构造函数
Manager向上转型为Employee时,调用覆写方法时,虚拟机能够识别具体引用对象类型,调用覆写后的方法(重点)即对象多态性
上转的对象只能调用父类中已有的方法(或者是之类覆写的方法)从子类到父类中查找改方法
Java不支持多继承,可实现多接口
不能将超类的引用赋给子类(不是每个员工都是经理)
动态绑定(对象方法执行过程)方法名字和列表成为方法的签名
1)获取所有候选方法
2)重载解析
3)private,static,final方法实现动态绑定
4)需找合适的方法(具体见上对象多态性)
虚拟机为每个类创建一个方法表,便于查找,节省搜索时间,子类方法不能低于父类方法的可见性
阻止继承:
final类 final class...(Sting类)
final声明的方法不允许覆盖
c++和c#方法都默认不具有多态性(内联处理,频繁调用)
强制类型转换:
(int)x
向下转型之前需要判断是否能够成功转换
if(staff[1] instanceOf Manager){
boss=(Manager)staff[1];
}
protected方法只对子类和同一包中的其他类可见
默认——只对本包可见
object类:所有类的超类,可引用任何类型对象
Object提供的服务:
equal()方法:两个对象状态相等,则这两个对象就相等(getclass()返回对象所属的类或者对象instanceOf...(对象是类或其子类的实例))
相等测试与继承:
自反性,对称性,传递性,一致性
1)if(this==otherObject) return true;
2) if(otherObject==null) return false;
3) if(getClass!=otherObject.getClass()) return false;后者if(!(otherObject instanceOf ClassName)) return false;
4)进行域的比较:return field1==other.field1&&field2==.....
hashcode();计算散列码,每个对象默认散列码为其存储地址(散列码是由其内容导出的)若重新定义equals()方法,则必须定义hashcode()方法,返回一整数值,且需要和equals定义保持一致。
toString()方法:当把一个对象与一个字符串用+连接起来时,Java编译会自动调用toString()方法
参数数量可变的方法:(...相当于[]数组的意思)
public static double max(double... values){
for(double v:values){}
}
枚举:
所有枚举类型都是Enum类的子类
static Enum valueOf(Class enumClass,String name);
toString();
返回枚举常量名
int ordinal()
返回枚举常量位置,从零开始
反射:
使用对象主要是工具构造者
继承设计的技巧:
1)将公共操作和域放在超类
2)不要使用受保护的域
3)使用继承实现is-a关系
4)所有继承方法都有意义时才使用继承
5)覆盖方法时,不要改变预期的行为
6)使用多态,而非类型信息
反射对系统程序及其有用,不适用于应用程序