继承中属性的隐藏和方法的覆盖
java中规定,子类用于隐藏的变量可以和父类的访问权限不同,如果访问权限被改变,则以子类的权限为准
java中允许子类的变量与父类变量的类型完全不同,以修改后的数据类型为准java允许父类的变量被子类的常量隐藏,也允许父类的常量被子类的变量隐藏
java允许用实例成员变量来隐藏静态成员变量,也允许用静态成员变量来隐藏实例成员变量
覆盖
覆盖必须满足两个条件:1、方法名称必须相同 2、方法的参数必须完全相同,包括参数个数、类型、顺序
1、访问权限不相同的情况:子类方法的访问权限可以与父类不同,但只允许权限更宽松,而不允许更严格
2、返回值数据类型不同的情况:覆盖与被覆盖的方法的返回值数据类型必须完全相同
3、final修饰符不同的情况:
4、静态修饰符不同的情况:不允许出现父类方法和子类方法覆盖时的static修饰符发生变化
构造方法在覆盖时,只能是访问权限不同,只允许访问权限更宽松。java还规定,子类中无论哪个构造方法在执行时,都会先执行父类中无参数的构造方法
super只能在子类中使用,用来调用父类的成员或构造方法
子类的构造方法会自动调用父类不带参数的构造方法,但是不会调用带参数的构造方法。
如果子类确实有必要调用父类带参数的构造方法,就必须使用super关键字来实现
super使用规则:
它只能用在构造方法中,
它只能是第一条执行语句
一个构造方法中只能有一天super语句
java语言支持两种类型的多态性:运行时的多态性,编译时的多态性
多态性体现在两个方面:
方法重载:通常指在同一个类中,相同的方法名对应着不同的方法实现,但是方法的参数不同
成员覆盖:通常指在不同类中允许有相同的变量名,但是数据类型不同;也允许有相同的方法名,但是对应的方法实现不同
普通方法的重载
方法同名时,要求至少下面之一不同:1、参数个数不同 2、对应位置参数类型不同
void overload(int); 1 int overload(int,int); 2 double overload(); 3 int oveload(int); 1、2、3互为重载,但1、4之间不是重载
覆盖和重载的区别 :
重载和覆盖的方法名称都相同,但重载要求参数列表不同,而覆盖则要求参数列表完全相同
重载对于方法前面的修饰符没有限制,而覆盖则对这些修饰符的使用有限制
同一类中的方法能够相互重载,但不能相互覆盖。子类对父类方法既可以重载也可以覆盖
重载时,编译器在编译期间就可以确定调用哪一个方法,而覆盖则有可能在运行期间才能确定