JavaSE——继承和多态详解

简介: JavaSE——继承和多态详解

文章目录

一、继承

  1. 如何理解继承?
  2. 继承的语法
  3. 子类如何访问父类中的成员
  1. 子类构造方法
  2. final 关键字
  3. 继承与组合

二、多态

1.认识多态

 2. 多态实现条件

  1. 重写

4. 向上转移和向下转型

一、继承

  1. 如何理解继承?
  1. 继承的语法

关键字:extends

格式:

修饰符 class 子类 extends 父类 {

//... 

}
子类会继承父类的成员变量或者成员方法

子类继承父类后要添加自己特有的成员,即除了父类之外的特性

class Animal{

public String name;
public int age;

public void eat() {
    System.out.println(name+"吃饭");
}

}
class Dog extends Animal{

//新加的属性
public String silly;
public void houseGuard() {
    System.out.println("看门");
}

}
class Cat extends Animal {

//没有添加新属性
public void catchMouse()  {
    System.out.println(name+"抓老鼠");
}

}
public class Test {

public static void main(String[] args) {

    //name和age属性是从父类Animal中继承下来的

    Dog dog = new Dog();
    Cat cat = new Cat();

}

}
还要注意:Java中不支持多继承,一个子类只能继承一个父类

  1. 子类如何访问父类中的成员

3.1 访问成员变量
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找

如果找不到,则在父类继承下来的成员变量中寻找要访问的成员变量,找不到编译失败

3.2 访问成员方法
成员方法名字不同:

优先访问自己的,若没有,去访问从父类继承的

成员方法名字相同:

父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,没有则报错

3.3 super关键字
用法:在子类方法中访问父类的成员

class Dog extends Animal{


public String silly;
public void houseGuard() {

    System.out.println(super.name+"看门");

}

}
 父类的name没有赋初值,因此是null ,这样就访问到了同名的父类的成员变量

 this.会有优先问自己的,没有则访问从父类中继承的

super.直接访问从父类中继承下来的,在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可

注意:上文父类的普通成员方法、变量是指非静态成员方法、变量

  1. 子类构造方法

子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法

看代码:

class Animal{

public String name;
public int age;

//提供一个两个该参数的构造方法
public Animal(String name, int age) {
    this.name = name;
    this.age = age;
}

public void eat() {
    System.out.println(name+"吃饭");
}

}

//此处报错

class Dog extends Animal{


public String silly;
public void houseGuard() {
    System.out.println(super.name+"看门");
}

}

对象的初始化需要调用构造方法

添加了带有两个参数的构造器后,编译器不会提供无参的构造方法,因此出现错误

接下来我们看当提供了两个参数的构造方法时如何初始化:

class Dog extends Animal{


public String silly;
    public Dog(String name, int age, String silly) {

    //先初始化父类部分
        super(name, age);
        this.silly = silly;

    }

    public void houseGuard() {
    System.out.println(super.name+"看门");
}

}
super(name,age)会先调用父类的构造方法完成初始化

this.silly = silly会完成自己属性的初始化

  1. final 关键字
  2. 修饰变量或字段,表示常量
  3. 修饰类:表示此类不能被继承

String 字符串类, 就是用 final 修饰的, 不能被继承

  1. 修饰方法:表示该方法不能被重写
  2. 继承与组合

与继承相似,组合也是表示类之间关系的方式,能实现代码的复用

继承表示各种类抽象出来的共性,对象之间是is-a的关系

组合(Composition)体现的是整体与部分、拥有的关系,即has-a的关系

例如交通工具车的组合:

class Tire {

public void run() {
    System.out.println("轮胎转动");
}

}

class Light {

public void light() {
    System.out.println("灯亮");
}

}

public class Vehicle {

private Tire tire;
private Light light;

public Vehicle(Tire tire,Light light) {
    this.tire = tire;
    this.light = light;
}

public void operation() {
    light.light();
    tire.run();
}

public static void main(String[] args) {
    Tire tire = new Tire();
    Light light = new Light();
    Vehicle vehicle = new Vehicle(tire,light);
    //灯亮
    //轮胎转动
    vehicle.operation();
}

}
二、多态
1.认识多态
不同的对象在完成某个行为时会产生出不同的状态就叫多态

例如:手机支付时产生的多态

 2. 多态实现条件

多态体现在:当代码运行时,传递不同类的对象时,会调用对应类中的方法

例如:

class Animal{

public String name;
public int age;

public Animal(String name, int age) {
    this.name = name;
    this.age = age;
}

public void eat() {
    System.out.println(name+"吃饭");
}

}

class Dog extends Animal{


public String silly;

    public Dog(String name, int age, String silly) {
        super(name, age);
        this.silly = silly;
    }
    @Override
    public void eat() {
        System.out.println(name+"吃狗粮");
    }

    public void houseGuard() {
    System.out.println(super.name+"看门");
}

}
class Cat extends Animal {

public Cat(String name, int age) {
    super(name, age);
}

@Override
public void eat() {
    System.out.println(name+"吃猫粮");
}
//没有添加新属性
public void catchMouse()  {
    System.out.println(name+"抓老鼠");
}

}
public class Test {

public static void eat(Animal animal) {

    animal.eat;

}

public static void main(String[] args) {
    Dog dog = new Dog("dog",2,"silly");
    Cat cat = new Cat("cat",3);
    eat(dog);
    eat(cat);

}

}

 Test类中的eat方法参数为Animal,该方法内部并不知道,也不关注当前的a引用指向哪个实例,此时 a这个引用调用 eat方法可能会有多种不同的表现(和 a 引用的实例相关), 这种行为就称为多态

  1. 重写

概念:返回值和形参都不能改变,子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写

重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法

4. 向上转移和向下转型
向上转型:创建一个子类对象,将其当成父类对象来使用
//语法格式:父类类型对象名 = new 子类类型()

Animal animal = new Cat("cat",2);

 使用:

方法一:直接赋值(子类对象赋值给父类对象)

public class Test {

public static void main(String[] args) {
    Dog dog = new Dog("dog",2,"silly");
    Animal animal = dog;
    Animal animal1 = dog;
    Animal animal2 = dog;
}

}
方法二:方法传参(形参为父类型引用,可以接收任意子类的对象)

public static void eat(Animal animal) {

    animal.eat;

}

方法三:方法返回(作返回值:返回任意子类对象)

public static Animal func(){

    return new Cat("dog",2);
}

向下转型:父类引用再还原为子类对象
public class Test {

public static void main(String[] args) {

    Animal animal = new Cat("haha",2);

    if(animal instanceof Cat){
        Cat cat = (Cat) animal;
        cat.catchMouse();
    }
}

}
为了提高向下转型的安全性,引入了instanceof,如果该表达式为true,则可以安全转换

相关文章
|
SQL 监控 安全
网络安全中的安全漏洞管理与修复:技术深度剖析
【7月更文挑战第8天】安全漏洞的管理与修复是网络安全工作的重要组成部分。通过定期的安全审计、更新与补丁管理、漏洞扫描与评估、及时修复及持续监控与响应等措施,可以有效提升网络系统的安全性。然而,网络安全是一项长期而艰巨的任务,需要不断关注最新的安全动态和技术发展,持续优化安全策略和管理流程,以应对日益复杂的网络安全挑战。
载波相移CPS-SPWM调制方法的simulink建模与仿真
本课题研究载波相移CPS-SPWM调制方法的Simulink建模与仿真。CPS-SPWM通过在多个功率单元中引入载波相移,使开关动作错开,输出多电平PWM波形,接近理想正弦波。系统采用单极倍频调制波反相法,生成互补脉冲序列控制开关管通断。双极性CPS-PWM的电压电平数为n+1,基波分量是单个双极性PWM的N倍。仿真结果验证了该方法的有效性,核心程序基于MATLAB2022a实现。
|
11月前
|
Web App开发 搜索推荐 开发者
浏览器插件上架指南:如何把你的产品搬上浏览器插件市场
在实践了 Chrone、Firefox、Edge、Opera 等 几个主要的插件平台的上架发布工作后,我觉得很有必要把这个过程和思考记录下来,分享给大家,希望能提供一些参考和避坑的经验。我想通过这篇文章,和大家聊聊「为什么我要做这件事」,以及「这个系列文章会包含哪些内容」。我想用一个系列的文章,记录我是如何把 EmojiClick 搬到浏览器插件市场的,也给大家提供一些借鉴经验。
301 19
|
前端开发 持续交付 UED
模块联邦的适用场景
【10月更文挑战第25天】模块联邦适用于需要实现模块共享、组合、拆分和重组的场景,可以提高应用的可维护性、扩展性、灵活性和性能。在实际应用中,需要根据具体的需求和项目特点选择合适的模块联邦方案,并结合其他技术和工具进行综合应用。
|
存储 安全 Windows
移动硬盘删掉的文件怎么恢复?试试这5个方法
移动硬盘是常见的数据存储工具,因容量很大、携带方便,很多人都愿意选择移动硬盘作为备份数据或存储日常数据的工具。不过,有时候,我们在使用移动硬盘的时候难免会误操作,比如不小心删除了重要文件。这时候,很多人会问,移动硬盘上误删掉的文件还能恢复吗?今天小编就为大家介绍一下如何快速的恢复移动硬盘丢失的文件。
|
11月前
|
搜索推荐 数据挖掘 API
阿里巴巴API接口对电商的影响与收益
在全球电子商务快速发展的背景下,阿里巴巴作为领先的B2B平台,为中小企业提供商品批发、分销、供应链管理等一站式服务,并通过开放的API接口为开发者和电商企业提供数据资源与功能支持。本文将深入解析阿里巴巴API接口的功能(如商品搜索、详情、订单和用户管理)、应用(如商品展示、搜索优化、交易管理和用户行为分析)、收益(如流量增长、销售提升、库存优化)及实际案例,附带代码示例,助力电商从业者提升运营效率和用户体验。
379 0
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
313 7
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
452 3
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
网络架构
深入了解会话描述协议(SDP)
【8月更文挑战第24天】
1013 0