域
域就是范围的意思 例{}之间,称为一块域,用来描述变量适用范围,全局变量的域是整个类,局部变量只适用于他所在的{}之间。
接口中的域是指: 显式声明的 public final static String NAME;//变量 隐式声明的 String NAME;//变量接口中的变量默认是public final static 的,因此在interface中声明的变量建议大写的声明的时候必须初始化,使用的时候不能被更改,只能作右值
重载(overload)
发生在一个类的内部,而且是针对方法而不是域而言。若方法的签名相同,但参数的个数或者参数的类型不同,则构成了重载。但返回类型不在考虑范围之内,也就是说,如果仅仅是返回类型不同,则构不成重载。
注意:
1. 参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同;
2. 返回值和异常以及访问修饰符,不能作为重载的条件;
3. main方法也是可以被重载的;
覆盖(override)
发生在父类和子类之间,而且是针对实例方法(即非静态方法)而不是域而言。构成覆盖要满足以下条件:
1.父类中的static方法不可以被覆盖;
2.父类中的final方法不可以被覆盖;
3.方法的签名、参数个数以及参数类型都要相同;
对于返回类型要说明两点:
- 如果返回类型是引用类型,则覆盖方法的返回类型可以声明为父类方法声明的返回类型的子类型;
- 如果返回类型是基本类型,则覆盖方法的返回类型必须和父类方法的返回类型相同;
- 对于方法参数的说明:不管父类方法中的参数是否是final的,子类都可以修改这个参数;
4.父类中的final方法不可以被覆盖;
5.子类方法可以改变某些方法修饰符,如:synchronized、native和strictfp;
6.子类方法的throws子句可以和父类方法不同,它列出的每一个异常类型都应该和父类中的异常类型相同或者是父类异常类型的子类;
隐藏(hidden)
父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。
注意:当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定。
1.方法隐藏只有一种形式,就是父类和子类存在相同的静态方法。
2.属性只能被隐藏,不能被覆盖
3.子类实例变量/静态变量可以隐藏父类的实例/静态变量,总结为变量可以交叉隐藏
隐藏和覆盖的区别
被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性
被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法
因为覆盖是动态绑定,是受RTTI(run time type identification,运行时类型检查)约束的,隐藏不受RTTI约束,总结为RTTI只针对覆盖,不针对隐藏
特殊情况:
1.final修饰的属性可以被隐藏,但是不能被赋值,即不能用=来赋值,网上说final属性不能被修改,这个说法不准确,因为对于引用类型的变量用final修饰后,它只是不能被指向其他对象,但是可以改它自身的值,可以用ArrayList测试,final属性可以在运行的时候进行初始化,但是不能不出现初始化语句
2.final修饰的方法不能被覆盖,可以被重载
3.final修饰的类不能被继承
4.private 方法隐式添加了final