【新手必看:Java继承教程】

1. 什么是继承

    - 介绍继承的概念和作用

    - 解释继承关系中的父类(基类)和子类(派生类)

    - 呈现继承关系的示意图

继承在现实生活中无处不在。你继承了你父母的基因,并从他们俩那里获得了身体特征——但后来你又在上面添加了自己的个性。技术产品(计算机、手机等)继承了其前辈的功能考虑苹果和香蕉虽然苹果和香蕉是不同的水果,但它们的共同点是它们是水果。因为苹果和香蕉是水果,简单的逻辑告诉我们,任何对水果是正确的东西,对苹果和香蕉也是如此。例如,所有水果都有名称、颜色和大小。因此,苹果和香蕉也有名字、颜色和大小。我们可以说苹果和香蕉继承(获得)水果的所有特性,因为它们水果。我们也知道水果会经历一个成熟过程,通过这个过程它可以食用。因为苹果和香蕉是水果,我们也知道苹果和香蕉会继承成熟的行为。

 在此图中,三角形既是子类(对图形)又是父类(对直角三角形)。子类从父类继承行为和属性会受一些访问限制的约束。以下是一些常见的访问限制:

1. 继承的属性的访问限制:

   - 如果父类的属性是私有的(private),则子类无法直接访问父类的私有属性。

   - 如果父类的属性是受保护的(protected),则子类可以直接访问父类的受保护属性。

   - 如果父类的属性是默认访问修饰符(即没有明确指定访问修饰符,默认为包级私有),则子类只能在相同的包中访问父类的属性。

2. 继承的方法的访问限制:

   - 如果父类的方法是私有的(private),则子类无法直接访问父类的私有方法。

   - 如果父类的方法是受保护的(protected),则子类可以直接访问父类的受保护方法。

   - 如果父类的方法是默认访问修饰符,则子类只能在相同的包中访问父类的方法。

   - 如果父类的方法是公共的(public),则子类可以直接访问父类的公共方法。

需要注意的是,子类可以通过调用父类的公共方法来访问父类的私有属性,但不能直接访问。

此外,子类还可以使用关键字 "super" 来访问父类中被子类覆盖的方法。

这些访问限制的约束有助于保护父类的封装性,并确保子类对继承的行为和属性的访问符合设计意图。

2. 继承的优势

    - 简化代码:通过继承,子类可以直接继承父类的属性和方法,减少重复代码的编写

    - 提高代码的可重用性:可以通过继承的方式创建新的类,而不需要从头开始编写所有的属性和方法

    - 实现多态:通过向上转型和向下转型,实现对父类和子类对象的统一处理

3. 如何定义一个继承关系

   用一个示例来演示如何在子类中继承父类的属性和方法,并解释 super 关键字的作用。

// 定义父类
class ParentClass {
    private int parentPrivateField;  // 私有属性

    public void parentPublicMethod() {  // 公共方法
        System.out.println("这是一个父类公共方法");
    }

    private void parentPrivateMethod() {  // 私有方法
        System.out.println("这是一个父类私有方法");
    }
}

// 定义子类,继承父类
class ChildClass extends ParentClass {
    // 子类继承父类的属性和方法

    public void childPublicMethod() {
        System.out.println("这是一个子类公共方法");
    }

    // 子类还可以定义自己的属性和方法
    private int childPrivateField;

    public void childMethod() {
        System.out.println("我是我自己定义的");
    }
}

在上面的代码中,ChildClass 使用 extends 关键字继承了 ParentClass,这个关键字表示子类 ChildClass 继承了父类 ParentClass 的属性和方法。

子类 ChildClass 继承了父类 ParentClass 的公共方法 parentPublicMethod(),并可以在子类中直接调用并使用。子类也可以自行定义自己的属性和方法。

在子类中,可以使用 super 关键字来引用父类的属性和方法。super 用于调用父类的构造方法或者访问被子类覆盖的父类方法或属性。

下面是一些示例用法:

class ChildClass extends ParentClass {
    private int childPrivateField;

    public void childMethod() {
        super.parentPublicMethod();  // 调用父类的公共方法
        super.parentPrivateMethod(); // 错误,无法调用父类的私有方法
    }
}

需要注意的是,如果子类中定义了与父类相同名称的属性或方法,子类会覆盖(覆写)父类中的对应属性或方法。使用 super 关键字可以在子类中访问被覆盖的父类方法或属性

5. 方法的重载

- 介绍方法重载的概念和作用

假如有一辆车,它会根据上车的动物类型不同载向不同的地方。把这辆车看成方法名,不同的动物类型看成不同的参数类型。载向不同的地方看成方法的结果。这就是重载。当一个类中存在多个方法名相同但参数列表不同的方法时,这种情况被称为方法重载。方法重载通过改变方法的参数类型、数量或顺序来实现,从而能够根据不同的参数类型和个数来调用不同的方法。

  - 解释在继承关系中,父类和子类中的方法重载的规则和注意事项

在继承关系中,如果父类和子类中出现了方法重载,有一些规则和注意事项需要考虑:

1. 子类可以重载父类的方法。这意味着子类可以定义一个与父类同名但参数列表不同的方法。重载的方法与父类的方法无关,它们只是具有相同的方法名而已。

2. 子类重载父类的方法时,方法的访问修饰符不能比父类的更严格。例如,如果父类的方法是公共方法(public),那么子类重载的方法也必须是公共方法。

3. 子类重载父类的方法时,方法的返回类型必须与父类方法的返回类型兼容。子类可以返回父类方法的返回类型所能包括的任何子类型。

4. 如果父类和子类中都存在一个完全相同的方法(包括方法名、参数列表和返回类型),那么这不算是方法重载,而是方法覆盖(方法重写)。方法覆盖是指子类重新实现了父类的方法,在子类中调用该方法时,将执行子类自己的实现。

5. 在进行方法重载时,根据输入参数的类型、个数和顺序来匹配调用哪个方法。Java编译器通过方法的参数列表来区分重载的方法,并决定调用哪个方法。

一句话总结:在继承关系中,子类可以重载父类的方法,但方法的访问修饰符不能更严格,返回类型必须兼容,重载时根据参数类型、数量和顺序进行匹配,如果与父类方法完全相同(包括方法名、参数列表和返回类型)则为方法覆盖。

6. 向上转型和向下转型

    - 详细讲解向上转型和向下转型的概念和用途

    - 提供代码示例,展示如何进行向上转型和向下转型,并访问不同类型对象的特定属性和方法

在Java中,向上转型是将一个子类类型的对象赋值给父类类型的变量,而向下转型正好相反,是将一个父类类型的对象赋值给子类类型的变量。向上转型可以安全地进行,而向下转型需要在编译时或运行时进行类型检查,以确保转型的安全性。

下面提供代码示例,展示如何进行向上转型和向下转型,并访问不同类型对象的特定属性和方法:

class Animal {
    public void eat() {
        System.out.println("The animal is eating");
    }
}

class Dog extends Animal {
    public void eat() {
        System.out.println("The dog is eating");
    }

    public void bark() {
        System.out.println("The dog is barking");
    }
}

public class Main {
    public static void main(String[] args) {
        // 向上转型
        Animal animal = new Dog();

        animal.eat(); // 调用的是子类Dog的eat方法

        // 向下转型
        Dog dog = (Dog) animal;

        dog.eat(); // 调用的是子类Dog的eat方法
        dog.bark(); // 调用的是子类Dog的bark方法
    }
}

继承后的三种定义方式

class Animal {

    public void eat() {

        System.out.println("The animal is eating");

    }

}

class Dog extends Animal {

    public void eat() {

        System.out.println("The dog is eating");

    }

    public void bark() {

        System.out.println("The dog is barking");

    }

}

public class Main {

    public static void main(String[] args) {

        // 第一种:向上转型

        Animal animal = new Dog();

        animal.eat(); // 调用的是子类Dog的eat方法

        // 第二种:向下转型

        Dog dog = (Dog) animal;

        dog.eat(); // 调用的是子类Dog的eat方法

        dog.bark(); // 调用的是子类Dog的bark方法

      //第三种:单纯地使用"Dog"类来创建一个"Dog"类型的对象,并将该对象赋值给一个名为"dog"的变量

Dog dog2 = new Dog();

   }

}

问题:向下转型的主要目的是访问子类特有的属性和方法,我使用"Dog dog = new Dog()"这样的语法来定义一个Dog类的对象。使用"dog"变量来访问和操作Dog类即子类的属性和方法了。这两种定义方式起到的作用一样为什么还要弄出两种定义方式

这两种定义方式的作用是不一样的:

1:"Dog dog = new Dog()":这种定义方式是直接创建一个"Dog"类型的对象,并将该对象赋给一个"Dog"类型的变量。使用"dog"变量可以直接访问和操作"Dog"类的属性和方法。这种方式不涉及向上转型或向下转型。

2:向下转型:向下转型通常是在已经使用向上转型,将子类对象赋给父类引用后,再重新将父类引用转回子类引用的过程。这样做是为了访问子类特有的属性和方法。向下转型需要使用强制类型转换的方式。

综上所述,这两种定义方式的作用是不同的。如果您只需要创建一个"Dog"类型的对象,并直接使用"Dog"的属性和方法,不需要进行类型转换。而如果您已经使用了向上转型,将子类对象赋给了父类引用,如果需要重新访问子类特有的属性和方法,那么就需要进行向下转型的操作

问题2:怎么理解父类引用和子类引用

父类引用指的是用父类类型的引用变量来引用子类对象。例如,如果有一个Animal类作为父类,有一个Dog类作为子类,那么可以使用Animal类的引用来引用Dog对象。这样可以通过该引用变量来访问从父类继承下来的属性和方法,但不能访问子类特有的属性和方法。

子类引用指的是用子类类型的引用变量来引用子类对象。使用子类引用变量可以访问从父类继承下来的属性和方法,也可以访问子类特有的属性和方法。

示例:

Animal animal = new Dog();  // 父类引用引用子类对象
animal.sleep();  // 父类方法
animal.eat();  // 父类方法
// animal.bark();  // 编译错误,父类引用无法访问子类特有的方法

Dog dog = new Dog();  // 子类引用引用子类对象
dog.sleep();  // 父类方法
dog.eat();  // 父类方法
dog.bark();  // 子类特有的方法

这样的好处就是:通过使用不同的引用变量类型,可以在不同情况下灵活地访问父类的属性和方法,以及子类特有的属性和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值