【学习总结|DAY014】Java面向对象高级-继承、多态

一、继承(Inheritance)
1. 概述

继承是面向对象编程的一种特性,允许我们定义一个类(称为子类或派生类)以继承另一个类(称为超类或基类)的功能。

2. 语法格式
public class Zi extends Fu {
    // 子类新增的属性和方法
}
3. 继承的优点
  • 代码复用:子类自动拥有父类的非私有成员变量和方法。
  • 层次结构清晰:有助于构建和维护大型项目。
4. 访问权限修饰符

Java中有四种访问权限修饰符:

  • private:仅在本类内可见。
  • default(即不写任何修饰符):在同一包内可见。
  • protected:在同一包内及子类中可见。
  • public:在任何地方都可见。

这些修饰符决定了成员变量的访问范围,从严格到宽松依次为:private < default < protected < public

5. 继承的特点
  • 单一继承:每个子类只能有一个父类。
  • 多层继承:可以通过多个层次进行继承。
  • 所有类默认继承自Object类。
6. 方法重写(Overriding)

当子类需要提供不同于父类的实现时,可以使用@Override注解来重写父类的方法。

二、多态(Polymorphism)
1. 概述

多态是指在程序中同一个行为具有多种表现形式。它是面向对象程序设计的重要内容之一。

2. 多态的表现形式

主要有两种形式:

  • 方法的多态:通过重载(overloading)和重写(override)来实现。
  • 对象的多态:通过向上转型(upcasting)和向下转型(downcasting)来实现。
3. 向上转型

将子类的引用赋值给父类的引用,例如:

Person p = new Student();

此时只能调用Person类中的方法,不能调用Student特有的方法。

4. 向下转型

在某些情况下,我们需要访问子类特有的方法和属性,这时需要进行强制类型转换,即向下转型:

if (p instanceof Student) {
    Student s = (Student)p; // 强制转换为Student类型
    s.study(); // 调用Student类特有的study方法
} else {
    System.out.println("p is not a Student");
}

需要注意的是,在进行向下转型之前必须确保对象确实是目标类型的实例,否则会抛出ClassCastException异常。

5. instanceof操作符

用于判断一个对象是否属于某个特定类型或其子类型:

boolean result = p instanceof Student;

返回值为true表示pStudent类型的实例,否则为false

三、示例代码解析

下面是一段演示继承和多态特性的简单Java程序:

public class Demo153 {
    public static void main(String[] args) {
        // 创建一个Student对象并向上转型为Person类型
        Person p = new Student();
        
        // 尝试调用Student特有的study方法,但由于p被声明为Person类型,
        // 所以编译时会报错,因为Person类中没有定义study方法。
        // 为了解决这个问题,我们可以使用instanceof操作符来判断p是否实际上是Student类型,
        // 然后再进行强制类型转换。
        if (p instanceof Student) {
            ((Student)p).study(); // 正确地调用了Student类的study方法
        } else {
            System.out.println("p is not a Student");
        }
    }
}

class Person {
    public void run() {
        System.out.println("Person running...");
    }
}

class Student extends Person {
    @Override
    public void study() {
        System.out.println("Student studying...");
    }
}

在这个例子中,我们首先创建了一个Student对象s,并将其向上转型为一个Person类型的引用p。当我们试图直接通过p调用study()方法时,由于p的类型是Person而不是Student,所以编译器会报错。为了解决这个问题,我们使用了instanceof操作符来检查p是否实际上是一个Student对象,如果是的话,我们就将其强制转换为Student类型,然后就可以正常调用study()方法了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值