继承与成员方法的关系--方法的重写
方法重写的概述
当子类中的方法与父类中的方法一样的时候,内部实现不一样,这种现象我们称之为方法的重写,方法的覆盖
方法重写的定义
子类中的方法名与形参列表以及返回值都和父类一样,只是内部实现不一样
面试题
Java中重写与重载的区别:
1、重写是发生在继承的关系中,子类的方法名、参数列表、返回值都和父类一样
2、重载是发生在同一个类中,方法名一样,参数列表不一样,与返回值无关
生活中方法重写的举例:
BB机--大哥大--小灵通--智能手机
水杯--保温杯--破壁杯
class OldPhone{
public void call(String name){
System.out.println("给"+name+"打电话");
}
}
class NewPhone extends OldPhone{
public void call(String name){
// System.out.println("给"+name+"打电话");
super.call(name);//调用父类的call方法
System.out.println("学习");
}
}
public class ExtendsDemo4 {
public static void main(String[] args) {
NewPhone newPhone = new NewPhone();
newPhone.call("照应");
}
}
子类中playFootball方法与父类中playFootball方法的方法名相同、参数列表、返回值都相同,即为方法的重写
class Father3{
public void playFootball(){
System.out.println("踢足球");
}
private void fly(){
System.out.println("飞翔");
}
}
class Son3 extends Father3{
public void playFootball(){
System.out.println("功夫足球");
}
public void fly(){
System.out.println("飞");
}
}
public class ExtendsDemo5 {
public static void main(String[] args) {
Son3 son3 = new Son3();
son3.playFootball();//功夫足球
son3.fly();//飞
}
}
方法重写在IDEA里的智能键入:
class Father3{
public void playFootball(){
System.out.println("踢足球");
}
//private关键字修饰的的方法,不可以在子类中被重写
private void fly(){
System.out.println("飞翔");
}
}
class Son3 extends Father3{
//@Override 今后看到这个符号,就代表重写了父类中的方法
@Override
public void playFootball() {
super.playFootball();
}
public void fly(){
System.out.println("飞");
}
}
public class ExtendsDemo5 {
public static void main(String[] args) {
Son3 son3 = new Son3();
son3.playFootball();
son3.fly();
}
}
方法重写的注意事项(存在于继承关系中)
1、子类中的私有成员方法无法被子类重写,案例如上述父类的fly方法
2、子类重写父类的方法的时候,访问权限不能比父类的访问权限要低
要么和父类定义方法的权限一致,要么就比它的访问权限高(子类成员方法的访问权限不低于父类成员方法访问权限)
建议重写的时候,子类与父类中方法定义的格式一致
class Father3{
public void playFootball(){
System.out.println("踢足球");
}
//去掉访问权限修饰符也可以使用
public void fly(){
System.out.println("飞翔");
}
}
class Son3 extends Father3{
@Override
public void playFootball() {
super.playFootball();
}
//public访问权限高于无访问修饰符访问权限
@Override
public void fly() {
super.fly();
}
}
public class ExtendsDemo5 {
public static void main(String[] args) {
Son3 son3 = new Son3();
son3.playFootball();
son3.fly();
}
}
3、父类中静态的成员方法,无法被子类重写,静态的成员是属于类本身的东西
class Father3{
public void playFootball(){
System.out.println("踢足球");
}
//父类的静态成员方法无法被子类重写
public static void fly(){
System.out.println("飞翔");
}
}
面试题:
1、方法重写与方法重载的区别?方法重载能改变返回值类型吗?
Override(重写)
Overload(重载):与返回值类型无关
2、this关键字与super关键字分别代表什么?以及他们各自的使用场景和作用