Java基础语法 三大特性之一——继承


1、继承的概念

继承是Java面向对象编程的三大特征之一,也是Java编程技术的一块基石,因为它允许创建分等级层次的类,也就是说继承是子类和父类的关系。

子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例和方法,或者这样理解,子类从父类继承方法,使得子类具有父类相同的行为。往简单了说就是继承是为了重用父类代码,两个类若存在is-a的关系就可以使用继承,这样明白了吧。

生活中随处可见继承关系:

图中兔子和羊属于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又是属于动物类。

它们都符合:is-a,所以这就是继承的关系。

虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性,这也是继承的特点之一。

下面说说继承的特点:

2、继承的关键字:extends

被继承的类称为父类,又叫基类、超类;继承的类称为子类,派生类

3、Java中继承的特点

在java中只存在单继承,无法实现多继承,但是可以实现逐级继承。

举个例子,父亲可以继承爷爷的姓氏,我也可以继承爷爷的姓氏。代码如下:

class GrandeFather {
    public String lastName="zhang";
    public void printName(){
        System.out.println("我姓"+this.lastName);
    }
}
class Father extends GrandeFather{
    public void printName1(){
        System.out.println("我也姓"+this.lastName);
    }
}
class Son extends Father{
    public void printName2(){
        System.out.println("我还姓"+this.lastName);
    }
}
class Test{
    public static void main(String[] args) {
        Son son = new Son();
        son.printName2();
        Father father = new Father();
        father.printName1();
        GrandeFather grandeFather = new GrandeFather();
        grandeFather.printName();
    }
}

运行结果:

我还姓zhang
我也姓zhang
我姓zhang
4、继承的具体表现:

1)父类有的,子类一定有(除了私有的);

2)父类没有的,子类可以有;

3)当父类有的,此时子类可以改(即可以重写父类的属性和方法)。

举个例子,父亲姓王,我也姓王,父亲吃饭,我也可以吃饭,父亲不抽烟,我可以抽烟,父亲喝酒,我可以喝饮料。代码如下:

class Father {
    public String lastName = "zhang";
    public void printName(){
        System.out.println("Father姓"+this.lastName);
    }
    public void eat(){
        System.out.println("eating");
    }
    public void drink(){
        System.out.println("Father likes to drink");
    }
}
class Son extends Father {
    public void printNameSon(){
        System.out.println("我也姓"+this.lastName);
    }
    public void smoke(){
        System.out.println("Father不抽烟,我抽");
    }
    public void drink() {
        System.out.println("我不让他喝!");
    }
}
class Test{
    public static void main(String[] args) {
        Father father = new Father();
        Son son = new Son();
        father.printName();//父类的方法
        son.printNameSon();//子类的方法,继承父类的属性
        father.eat();//父类的方法
        son.eat();//子类继承父类的方法
        son.smoke();//子类独有的方法
        father.drink();//父类的方法
        son.drink();//子类重写父类的方法
    }
}
5、为什么要用继承?

学到这里,我们反思一下,为什么我们要学习继承呢?不用继承不行吗?回答是不用继承也可以。看下面的例子:

//父亲类
class Father {
    public String lastName = "zhang";
    public void printName(){
        System.out.println("姓"+this.lastName);
    }
    public void eat(){
        System.out.println("吃饭");
    }
    public void drink(){
        System.out.println("喝酒");
    }
}
//儿子类
class Son{
    public String lastName = "zhang";
    public void printName(){
        System.out.println("姓"+this.lastName);
    }
    public void eat(){
        System.out.println("吃饭");
    }
    public void drink(){
        System.out.println("喝酒");
    }
}
//测试类
class Test{
    public static void main(String[] args) {
        Father father = new Father();
        Son son = new Son();
        father.printName();
        son.printName();
        father.eat();
        son.eat();
        father.drink();
        son.drink();
    }
}

从上面的代码可以看出来,代码存在重复了,导致后果就是代码量大量臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类,代码如下:

//公共父类
class Person {
    private String name;
    private int id;
    public Person(String myName, int myid) {
        name = myName;
        id = myid;
    }
    public void eat(){
        System.out.println(name+"正在吃");
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
    public void introduction() {
        System.out.println("大家好!我是"  + id + "号" + name + ".");
    }
}
//子类张三
class ZhangSan extends Person{
    public ZhangSan(String myName, int myid) {
        super(myName, myid);
    }
}
//子类李四
class LiSi extends Person{
    public LiSi(String myName, int myid) {
        super(myName, myid);
    }
}
//测试类
class Demo{
    public static void main(String[] args) {
        ZhangSan zhangSan = new ZhangSan("zhangsan",1);
        zhangSan.introduction();
        zhangSan.eat();
        zhangSan.sleep();
        LiSi liSi = new LiSi("lisi",2);
        liSi.introduction();
        liSi.eat();
        liSi.sleep();
    }
}

运行结果:

大家好!我是1号zhangsan.
zhangsan正在吃
zhangsan正在睡
大家好!我是2号lisi.
lisi正在吃
lisi正在睡
6、继承的优缺点
  • 继承的优点:

    从上面的代码我们可以看得出继承的最大优点就是提高了代码的复用性,减少了代码的冗余。

  • 继承的缺点:

    耦合性太大;

    打破封装,向子类暴露了实现细节。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

很萌の萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值