Java基础:【继承】的三个特点、注意事项

1 继承的三个特点

1.1 Java语言是单继承的

一个类的【直接父类】是【唯一】的(爸爸只有一个)

1.2 Java语言可以多级继承

*注意是多级继承,不是多继承

class A {} 
class B extends A {}
class C extends B {}

A是B的直接父类,B是C的直接父类,A也是C的父类(不是爷爷类)
在继承的体系中,所有类都有一个父类是java.lang.Object

1.3 Java语言父类可以有多个子类

很好理解 。。。

2 继承的注意事项

2.1 关于成员变量

2.1.1 在不同位置定义的变量,在调用时应注意区分

以下面的4个同名变量num为例:

public class Fu {
    int num = 1;
    
    public void fuMethod(){
        int num =0;
        System.out.print(num);
        System.out.println(this.num);
    }
}

public class Zi extends Fu {
    int num = 2;

    public void ziMethod() {
        int num = 3;
        System.out.print(num); // 访问的是局部变量3
        System.out.print(this.num); // 访问的是本类的成员变量2
        System.out.print(super.num); // 访问的是父类的成员变量1

        super.fuMethod();  // 用子类方法访问父类的方法
    }
}

main函数中创建一个子类的对象xiaoming,可调用自己的方法和其父的方法

public class FuZiDemo {
    public static void main(String[] args) {
        Zi xiaoming=new Zi();
        xiaoming.ziMethod(); // 调用子类方法(其中也调用了父类方法)
        System.out.println("——————");
        xiaoming.fuMethod(); // 调用父类方法
    }
}

/*
结果:
32101
——————
01
*/

2.2 关于成员方法

2.2.1 方法的覆盖重写@Override,要求父子方法名、参数都相同

public class Fu {
    public void method() {
        System.out.println("执行了父类方法");
    }
}

@Override可以不写,但写了可以检测是否成功进行了覆盖重写

public class Zi extends Fu {
    @Override
    public void method() { // 子类的方法名和父类相同,就在前写上@Override
        System.out.println("执行了子类方法");
    }
}
public class Demo {
    public static void main(String[] args) {
        Zi xiaoming = new Zi();
        xiaoming.method();
    }
}

// 执行了子类方法

扩展知识:

  1. 子类方法的返回值范围必须小于等于父类返回值的范围,如java.lang.object类是所有类的公共最高父类,java.lang.String就是Object的子类,那么父类如果返回值为String,则子类不能返回Object
  2. 子类的权限修饰符必须大于等于父类的权限修饰符,public > protected > (default) > private

当然,大多数情况下父子返回值、权限修饰符是相同的

2.2.2 开发新产品应使用继承,而不能对原来的产品直接改动

老款手机的功能:

public class Phone {
    public void call() {
        System.out.println("打电话");
    }

    public void message() {
        System.out.println("发短信");
    }

    public void show() {
        System.out.println("显示来电号码");
    }
}

新款手机显示功能不仅能显示来电号码,还可以显示号码归属地:

(继承后,在子类中输入想要覆盖重写的方法(即输入‘show’),就可以自动按IDEA的提示补全父类中(show方法)的模版,在它的基础上方便地进行修改,下面两排“=”号之间的内容为输入‘show’后自动补全的)

public class PhoneNew extends Phone {
    /=================================
    @Override
    public void show() {
        super.show(); // 来电显示号码父类有,直接拿来用
    /=================================
        System.out.println("显示来电归属地"); // 这是加入的新功能
    }
}

main中展示两款手机各自的功能:

public class Demo {
    public static void main(String[] args) {
        System.out.println("以下是老款手机的全部功能:");
        Phone phone1 = new Phone();
        phone1.call();
        phone1.message();
        phone1.show();
        System.out.println("***********************");

        System.out.println("新款手机在原有的显示功能中加入了归属地:");
        PhoneNew phone2 = new PhoneNew();
        phone2.call();
        phone2.message();
        phone2.show();
    }
}

/*
以下是老款手机的全部功能:
打电话
发短信
显示来电号码
***********************
新款手机在原有的显示功能中加入了归属地:
打电话
发短信
显示来电号码
显示来电归属地
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值