方法重写与多态

embedded/2024/10/11 3:04:55/

方法重写

1.在子类和父类直接

2.方法名相同

3.参数个数和类型相同

4.返回类型相同或是其父类

5.访问权限不能严于父类

package com.hz.ch04.test01;public abstract class Pet {private String name;private int love;private int health;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getLove() {return love;}public void setLove(int love) {this.love = love;}public int getHealth() {return health;}public void setHealth(int health) {this.health = health;}public Pet(String name, int love, int health) {this.name = name;this.love = love;this.health = health;}public abstract void print();
}
package com.hz.ch04.test01;public class Dog extends Pet {public Dog(String name, int love, int health) {super(name, love, health);// TODO 自动生成的构造函数存根}public void print() {System.out.println("宠物的自白:");System.out.println("我的名字叫"+getName()+"我的健康值是"+getHealth()+"我和主人的亲密度是"+getLove());System.out.println("我是一只雪娜瑞犬");
}
}

Object

object类是超类(基类)

java中所有的类都直接或间接继承Object

类型转换

向上转型:子类转父类(自动转换)

向下转型:父类转子类(强制转换)

instanceof:判断是否可以转换为指定类型

package com.hz.ch04.test04;import com.hz.ch04.test04.Dog;
import com.hz.ch04.test04.Penguin;
import com.hz.ch04.test04.Pet;public class Master {public void zuo(Pet p) {if(p instanceof Dog) {Dog dog = (Dog)p;dog.pick();}else if (p instanceof Penguin) {Penguin penguin = (Penguin)p;penguin.swimming();}}public Pet lingYPet(int type) {if(type==1) {Dog dog = new Dog("张三", 40, 60, "拉布拉多");return dog;}else if(type==2) {Penguin penguin = new Penguin("李四", 30, 80, "Q妹");return penguin;}return null;}
}

抽象

abstract抽象类:不能被实例化,等待被继承

public abstract class Pet

abstract抽象方法:

1.抽象方法使用abstract修饰 public abstract void

2.抽象方法没有方法体

3.抽象方法必须被重写

4.抽象方法必须在抽象类中,而抽象类中可以没有抽象方法

抽象类

public abstract class Animal { public abstract void run();
}

抽象类的子类

public class Cat extends Animal {public void run (){System.out.println("小猫在墙头走~~~");}
}

测试类

public class CatTest {public static void main(String[] args) { // 创建子类对象Cat c = new Cat();// 调用run方法c.run();}
}

多态

在Java中,多态面向对象中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现。具体来说,多态性指的是通过父类的引用变量来引用子类的对象,从而实现对不同对象的统一操作。

在Java中,要实现多态性,就必须满足以下条件:

继承关系

存在继承关系的类之间才能够使用多态性。多态性通常通过一个父类用变量引用子类对象来实现。

方法重写

子类必须重写(Override)父类的方法。通过在子类中重新定义和实现父类的方法,可以根据子类的特点行为改变这个方法的行为,如猫和狗吃东西的独特行为。

父类引用指向子类对象

使用父类的引用变量来引用子类对象。这样可以实现对不同类型的对象的统一操作,而具体调用哪个子类的方法会在运行时多态决定

class Animal {public void sound() {System.out.println("动物发出声音");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("狗发出汪汪声");}
}class Cat extends Animal {@Overridepublic void sound() {System.out.println("猫发出喵喵声");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Dog(); // 父类引用指向子类对象Animal animal2 = new Cat(); // 父类引用指向子类对象animal1.sound(); // 输出:狗发出汪汪声animal2.sound(); // 输出:猫发出喵喵声}
}

向上转型和向下转型

向上转型(Upcasting)是指将一个子类的对象引用赋值给其父类类型的引用变量。这是在面向对象编程中的一种常见操作,用于实现多态性和灵活的对象处理。

在向上转型中,子类对象可以被视为父类对象,可以使用父类类型的引用变量来引用子类对象。这样做的好处是可以以统一的方式处理不同类型的对象,实现代码的灵活性和可扩展性。

class Animal {public void eat() {System.out.println("Animal is eating.");}
}class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating.");}public void bark() {System.out.println("Dog is barking.");}
}public class Main {public static void main(String[] args) {Animal animal = new Dog();  // 向上转型animal.eat();  // 调用的是 Dog 类中的 eat() 方法// animal.bark();  // 错误:无法访问 Dog 类中独有的方法Dog dog = (Dog) animal;  // 向下转型dog.bark();  // 调用 Dog 类中的 bark() 方法}
}

向下转型(Downcasting)是指将一个父类类型的引用变量转换为其子类类型的引用变量。它与向上转型相反,需要进行显式的类型转换操作。

在某些情况下,当一个对象被向上转型后,它的具体类型信息会丢失,只保留了父类类型的信息。如果我们需要访问子类中特有的成员或调用子类重写的方法,就需要使用向下转型。

class Animal {public void eat() {System.out.println("Animal is eating.");}
}class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating.");}public void bark() {System.out.println("Dog is barking.");}
}public class Main {public static void main(String[] args) {Animal animal = new Dog();  // 向上转型// 使用向下转型之前,需要先检查对象是否实际上是子类的实例if (animal instanceof Dog) {Dog dog = (Dog) animal;  // 向下转型dog.bark();  // 调用 Dog 类中的 bark() 方法} else {System.out.println("animal is not an instance of Dog");}}
}


http://www.ppmy.cn/embedded/125673.html

相关文章

C++面试速通宝典——7

150. 数据库连接池的作用 数据库连接池的作用包括以下几个方面: 资源重用:连接池允许多个客户端共享有限的数据库连接,减少频繁创建和销毁连接的开销,从而提高资源的利用率。 统一的连接管理:连接池集中管理数据库连…

c++中的final说明符

final是c11引入的说明符,可以修饰在类或者类成员函数尾部。 final修饰类时,表示该类不能被继承。 class A final { }; 上例表明,类A是一个不能被继承的类。 class A { public:virtual void bar(); };class B final: public A { public:voi…

模拟实现消息队列(基于SpringBoot实现)

项目代码 提要:此处的消息队列是仿照RabbitMQ实现(参数之类的),实现一些基本的操作:创建/销毁交互机(exchangeDeclare,exchangeDelete),队列(queueDeclare&a…

JSON数据操作与处理全面指南

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于前后端的数据传递和API通信中。它基于键值对的方式组织数据,便于人类阅读和机器解析。在Java开发中,处理JSON数据通常需要使用一些常见的库&am…

rabbitMq-----消费者管理模块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言消费者字段消费者内存管理类新增/删除消费者 总的消费者管理类 前言 只有订阅客户端订阅了一个队列消息后,他才是一个消费者,而消费者存…

打破常规,BD仓储物流的效能提升!

当前,随着国家战略的推进,JS与民用领域的融合不断加深,物流业也步入了军民融合的新时代。在智能仓储物流方面,JS物流的智能化进展受到了BD系统的高度关注和重视。 一、建设JS仓储物流RFID基础设施 JS物流领域引入RFID技术的基础工…

238. 除自身以外数组的乘积

文章目录 1.题目2.思路3.代码 1.题目 238. 除自身以外数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32…

【Unity】版本不一致且未升级资产,导致 Unity Sprite 2D 动画播放错误

自己的 Unity版本是 2022.3.45f1。目前折腾的这插件 2D Action RPG Engine: Mythril2D ,推荐使用的 Unity 版本是 2021.3.18。 倒腾了这个 unity animation 动画半天,发现这个 animation sprite resolver 在导入动画帧的时候,一直都导入的是…