开发喵星球

OOP03-继承的梳理和总结

pPeHp90.png pPeHkB4.png

本文内容是继承的梳理和总结,本文内容包括:

继承解决了什么问题?

继承解决了什么问题,或者说为什么使用继承。

继承解决了两个问题

  1. 简化类的设计
  2. 代码复用

用一个例子说明

一:定义宠物类Pet

public class Pet {
    // 属性(数据)
    String type; // 宠物类型
    String name;  // 宠物名称
    String bread;  //宠物品种

    //构造
    public Pet(String type, String name, String bread) {
        this.type = type;
        this.name = name;
        this.bread = bread;
    }
    
    //构造
    public Pet() {
        this.type = "未知";
        this.name = "未知";
        this.bread = "未知";
    }

    // 自我介绍
    @Override
    public String toString() {
        return """
                 主人好呀!,我是%s品种的%s,我的名字是%s
                 """.formatted(bread, type, name);
    }

    // 叫一声
    public void sound(){
        System.out.println("宠物叫了1声");
    }

    // 叫多声
    public void sound(int times){
        System.out.println("宠物叫了"+times+"声");
    }
    
}

Pet类中定义的成员有:

  1. 三个属性(宠物类型,宠物名称,宠物品种)
  2. 三个方法(自我介绍、叫一声、叫多声)
  3. 两个构造函数

二:定义猫类Cat

public class Cat extends Pet {
    
}

Cat类继承了Pet类,但是在Cat类中没有定义任何成员。

三:定义测试类PetShop

public class PetShop {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "初九";
        System.out.println(cat.name);
        cat.sound(3);
    }
}

运行测试类,结果如下:

初九
宠物叫了3声

例子写完了,你观察Cat类,发现Cat类中没有定义任何成员,Cat类的设计很简单。但是在测试类中cat对象确能调用name属性和sound()方法。你会说name属性和sound()方法是从父类Pet继承的,这个说法是对的。

换个角度想,通过继承是不是简化了子类的设计,父类有的子类就有了,这就是继承的第一个好处,简化子类的设计

在思考一下,子类Cat调用的sound方法是从父类继承过来的,是不是子类复用了父类的方法,这就是继承的第二个好处,代码复用

其实继承还有第三个好处,就是实现多态,但是这篇文章我没有打算梳理多态,关于多态先放下。

小结:

  1. 继承能简化子类的设计
  2. 继承能复用父类的代码

new子类时父类被new了吗?

创建子类对象时,父类是否也创建了对象?

答:父类也创建了对象。

你想啊,如果在new子类对象时,如果没有new父类对象,也就没有为父类的成员分配内存,那么子类去哪里继承父类的成员呢!,这样想是不是更容易理解。

一个例子

public class A {
    int a;
}
public class B extends A{
    int b;

    public static void main(String[] args) {
        B b = new B();
    }
}

第5行共new了3个对象
1692330081788

先new子类还是先new父类?

答:先new父类,以保证new子类时,子类能从父类继承到父类成员

父类功能多还是子类功能多?

答:子类功能多。

看第2个问题的图示,更容易理解

为什么要方法重写?

答:父类中定义的方法能够满足父类的需要。但是子类从父类继承的方法有时候不能满足子类的需要。这时,可以在子类中再次定义该方法,来满足子类的需要。此时父类和子类中都有相同的方法定义,这种情况称作子类对父类方法重新定义,即方法重写。

所以方法重写一定发生在继承关系中。

父类和子类中可以定义相同的属性吗?

答:可以

子类调用自己的属性时使用 this

子类调用父类的属性时使用 super

子类默认调用自己的属性

这种情况也称为隐藏父类成员

Object类有父类吗?

答:Object类没有父类,Object是类的最高层。在Java中只有Object类没有父类。

Object类中有多少个方法,都是什么?

答:这个答案你自己去看源码吧,我就不在这里一一列举了。

但是Object类有几个重要的方法,我给你写出来,帮你加深记忆

以下代码是Object类的源码

public boolean equals(Object obj) {
        return (this == obj);
}

public native int hashCode();

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

如何让类不能被继承?

答:final

  1. final修饰的类不允许被继承
  2. final修饰的方法不允许被重写
  3. final修饰的变量不允许被改值

关于继承如下 3 点请记住

继承中的三件事

小贴士:

你是否发现了,父类功能越强大,子类功能就越强大

所以,现实生活中有个富有的爹,孩子就能站在更高的平台上,努力让下一代成为富二代吧!

   
分类:Java/OOP 作者:开发喵 发表于:2023-08-31 13:36:26 阅读量:105
<<   >>


powered by kaifamiao