Java继承多态总结。及this,static,super的用法。

本文介绍了面向对象编程中的继承和多态概念。详细解释了单继承的特点,子类如何继承父类的方法和属性,并通过实例展示了多态的应用场景,即如何在运行时确定对象的实际类型并调用相应的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承

  1. 只有单继承,除了构造器全部继承。子类是特殊的父类。
person ps = new men(); //此时构造器可以直接把子类转成父类;
  1. 子类可以直接赋值给父类,父类要通过强转成子类,运用instanceof进行检测。
men mn = (men) new person();  //父类需要强转成子类;

多态

  1. 多态出现在编译时类型和运行时类型不同的时候。
person ps = new men();
  1. 成员变量无多态。成员方法执行运行时类型。
ps.name  //此时执行的是父类的name;

ps.study();  //此时调用重写父类的子类方法;

this

  1. 默认this调用成员变量和成员方法,隐含this。
    此时的this代表了当前类。
String na = name;  //相当于 String na = this.name;

fly();  //相当于this.fly();
  1. 用于区分同名的局部变量和成员变量。
name = naem;  //相当于this.name = name;

static

  1. 用于定义静态变量和静态函数。又称类变量、方法。
    通过类名调用static定义的变量、方法。

  2. 在类(静态)方法中不可调用非静态(实例)变量、方法。
    但是实例(非静态)方法中可以调用static的变量、方法。

  3. 他们各自的生命周期也和类、实例的生命周期相同。
    通过类调用类方法,通过实例调用实例方法。

super

  1. 用于在子类中调用父类的成员变量和成员方法。
    前提是父类中定义的变量,方法的权限是protect以上。
public void testfly() {
        System.out.println("在这里可以调用父类");
        super.fly();  //通过super调用被覆写的函数;
        System.out.println("子类在这里可以调用" + super.name);
        //通过super调用父类的对象。
    }

在这里插入图片描述

### Java继承多态的概念及用法 #### 一、继承的定义实现 继承是面向对象编程的核心概念之一,它允许一个类(子类)基于另一个类(父类)进行扩展。通过继承,子类可以重用父类的属性和方法,并能够添加新的功能或修改现有行为。 在 Java 中,使用 `extends` 关键字来声明一个类是从另一个类派生而来的[^1]。例如: ```java class Parent { void display() { System.out.println("这是父类的方法"); } } class Child extends Parent { @Override void display() { System.out.println("这是子类覆盖的方法"); } void showChildFeature() { System.out.println("这是子类特有的方法"); } } ``` 上述代码中,`Child` 类继承自 `Parent` 类并覆写了其 `display()` 方法,同时还新增了一个名为 `showChildFeature()` 的特有方法[^2]。 --- #### 二、多态的表现形式 多态是指同一个接口或方法名可以根据不同的上下文表现出多种形态的能力。Java 支持两种主要类型的多态:编译时多态(静态绑定/方法重载)和运行时多态(动态绑定/方法重写)。这里重点讨论运行时多态。 当父类引用指向子类对象时,可以通过该引用调用被子类重写的父类方法。这种机制使得程序具有更高的灵活性和可扩展性。 下面是一个展示运行时多态的例子: ```java class Vehicle { void run() { System.out.println("车辆正在行驶..."); } } class Car extends Vehicle { @Override void run() { System.out.println("汽车正在快速行驶..."); } } public class TestPolymorphism { public static void main(String[] args) { Vehicle v; // 声明的是父类类型变量 v = new Vehicle(); v.run(); // 输出: 车辆正在行驶... v = new Car(); v.run(); // 输出: 汽车正在快速行驶... } } ``` 在这个例子中,尽管 `v` 是 `Vehicle` 类型的变量,但由于实际创建的对象不同,在执行 `run()` 方法时表现出了不同的行为,这就是典型的运行时多态现象。 --- #### 三、构造函数中的继承关系处理 需要注意的是,在子类实例化过程中,默认情况下会先调用父类的无参数构造器完成初始化工作后再继续自己的构造过程。如果希望指定特定版本的父类构造器,则需利用关键字 `super([args])` 明确指出要使用的具体构造签名。 以下是关于如何正确应用 `super()` 的示范片段: ```java class Person { String name; Person(String n) { this.name = n; System.out.println("Person 构造:" + name); } } class Student extends Person { int id; Student(String n, int i) { super(n); // 必须放在第一条语句位置上 this.id = i; System.out.println("Student 构造:" + name + ", ID:" + id); } } // 测试部分 public class MainTest { public static void main(String[] args) { Student s = new Student("张三", 101); } } ``` 此段代码展示了如何在一个更复杂的场景下合理运用继承以及超类构造器调用来满足需求的同时保持良好的设计原则。 --- ### 总结 综上所述,继承提供了代码复用的基础框架;而多态则增强了系统的适应性和表达力。两者共同作用于构建高效且易于维护的应用程序之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值