继承与多态

一、继承的基本概念

什么是继承?

继承就是可以直接使用前辈的属性和方法。

为什么需要继承?

自然界如果没有继承,那一切都是处于混沌状态。在软件开发中,我们可以借鉴自然界的机制。已经有的东西我们希望能够直接拿来用(复用)而不用重复做。

案例:定义人类

public class Person {
    private String id;//身份证号
    private String name;//姓名
    private byte sex;//性别

    public Person(String id, String name, byte sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }

    public void print(){
        System.out.println(id);
        System.out.println(name);
        System.out.println(sex);
    }
}

员工类:

public class Employee {
    private String id;
    private String name;
    private byte sex;
    private int salary;//工资

    public Employee(String id, String name, byte sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.salary = salary;
    }

    public void print(){
        System.out.println(id);
        System.out.println(name);
        System.out.println(sex);
        System.out.println(salary);
    }
}

这样做存在的问题:

(1)  重复劳动:人有姓名、性别等属性,员工中有重复定义了,将来可能在学生、教师等类中还要重复。

(2)  信息不一致:比如人的性别0-1表示,而员工类中可能用:“男/女”来表示,到使用上的混乱。

那么能否在员工类中使用已有的人类的姓名、性别等呢------继承

二、类的继承

如何使用继承呢?

public class Employee extends Person{
    private int salary;

    public Employee(String id, String name, String sex) {
        super(id, name, sex);
        this.salary = salary;
    }
    @Override
    public void print(){
        super.print();
        System.out.println(salary);
    }
}

使用继承就很好的解决了上面提出的两个问题。

 
Extends是“拓展、延伸”的含义,public  class Employee extends Person

就是声明一个叫做Emoployee的类,它是在Person类的基础上进行拓展,专业技术语称之为继承自Person类

Super是“超”的含义,Person类相对于Employee类就是超类,通俗一点的说法就是父类。

子类继承了父类的属性和方法,当然也可以再次基础上进行拓展—加和改。在案例中加了“薪水”属性,改了“打印”方法。这里有一个专业术语—重写(override)。

继承不仅解决了刚才的两个问题,还使得类有层次结构,逻辑上也更加合理。比如“员工”也是“人”。

三、访问权限控制(补充)

在之前已经讲过privatepublic

Private:私有的,外部不可访问的

Public:公有的,外部可以访问

Protected:保护的,外部访问如果是来自子类是可以的,其他的拒绝。

也就是外部分为两种:子类和非子类,对于子类而言,protected等同于public,而对于非子类proteocted有等同于private

比如在Employee 类中,如果name是私有的,那么这个访问就是被拒绝的。

而如果是保护的则可以。

public void print(){
    super.print(name);
    System.out.println(salary);
}

final:

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

四、多态

多态就是将同一个消息发送给不同对象时,它们所做的响应可能是不同的。比如说动物都有“叫”的方法,但是狗是“汪汪”,而猫是“喵喵”,当它们接收到被打的消息时,所做的响应是不同的。

案例:打动物

定义一个动物类,实现“叫”的方法

public class Animal {
    public void shout(){
        System.out.println("吼吼……");
    }
}

定义一个狗类,继承自动物类,重写“叫”的方法

public class Dog extends Animal {
    @Override
    public void shout() {
        System.out.println("汪汪……");
    }
}

定义一个猫类

public class Cat extends Animal {
    @Override
    public void shout() {
        System.out.println("喵喵……");
    }
}

测试程序

public class Test {
    public static void main(String[] args) {
        Dog d = new Dog();
        Cat c = new Cat();

        hit(d);
        hit(c);
    }

    private static void hit(Cat c) {
        c.shout();
    }

    private static void hit(Dog d) {
        d.shout();
    }
}

在测试程序中定义了两个“打”的方法,这种做法是比较笨拙的,有几种动物就需要定义几个方法,这个可能没完没了。有没有一个一劳永逸的方法?

不要传递Dog或者Cat等对象,而是传递一个Animal类对象就可以解决上面的问题。测试程序修改为

public class Test {
    public static void main(String[] args) {
        Dog d = new Dog();
        Cat c = new Cat();

        hit(d);
        hit(c);
    }

    private static void hit(Animal a) {
        a.shout();
    }
}

总结这里涉及两个知识点:

1)赋值兼容性规则

hit方法形参是Animal类型,而实参是Dog或者Cat,所以类型不一致,为什么还可以呢?

所谓赋值兼容性规则,指的是凡是需要用到父类引用的地方,都可以使用它的子类引用去代替。比如某人请求派接他,结果对方派了个三轮车去接了,虽然他可能不满意,但是也没有办法,因为对方是按照他的要求做的。

2)多态

形参一定是父类的引用,而实参可以是它的任何一个子类的引用。



  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值