🏆本文收录于「49天精通Java」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。
目录:
上期内容回顾
在上一期中,我们深入探讨了Java中的封装与访问控制,了解了封装的意义与实现、访问修饰符的使用以及如何编写getter和setter方法。这些知识帮助你更好地保护对象的状态并控制代码的可见性。今天,我们将深入学习面向对象编程(OOP)中非常重要的两个概念:继承与多态。我们将讨论继承的概念与实现、方法重写与super
关键字的使用,以及多态的基本概念与实际应用。
1. 继承的概念与实现
1.1 继承的概念
继承(Inheritance)是面向对象编程的一个重要特性,它允许一个类从另一个类继承属性和方法。继承使得我们能够建立一个类层次结构,将通用的功能集中在父类中,而特定的行为在子类中定义,从而实现代码的重用和扩展。
- 父类(Super Class):也称为基类或超类,是被继承的类。父类中的属性和方法可以被子类继承。
- 子类(Sub Class):也称为派生类,是继承自父类的类。子类继承了父类的所有非私有属性和方法,同时可以扩展新的属性和方法。
1.2 继承的实现
在Java中,通过extends
关键字来实现继承。一个类可以继承另一个类,并获得父类中的所有非私有成员。
案例:
创建一个父类Animal
和一个子类Dog
,演示继承的基本实现。
// 父类:Animal
public class Animal {
protected String name;
public void eat() {
System.out.println(name + " is eating.");
}
public void sleep() {
System.out.println(name + " is sleeping.");
}
}
// 子类:Dog
public class Dog extends Animal {
public void bark() {
System.out.println(name + " is barking.");
}
}
// 测试类
public class InheritanceTest {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.name = "Buddy";
myDog.eat(); // 继承自父类的eat方法
myDog.sleep(); // 继承自父类的sleep方法
myDog.bark(); // 子类的bark方法
}
}
程序说明:
Animal
类是父类,定义了两个方法eat
和sleep
,以及一个受保护的属性name
。Dog
类是子类,继承了Animal
类的所有非私有成员,并添加了自己的方法bark
。- 在
InheritanceTest
中,创建了一个Dog
对象,并调用了继承自父类的方法eat
和sleep
,以及子类自己的方法bark
。
1.3 继承的注意事项
- 单继承:Java中,一个类只能继承一个父类(单继承),但可以实现多个接口。
- 构造方法:子类不会继承父类的构造方法,但在子类的构造方法中,可以通过
super()
调用父类的构造方法。
2. 方法重写与super关键字
2.1 方法重写的概念
方法重写(Overriding)是指子类重新定义从父类继承的方法,以适应自身的需求。方法重写的主要目的是在子类中提供一个比父类更具体的实现。
方法重写的规则:
- 重写的方法名、返回类型、参数列表必须与父类方法一致。
- 重写方法的访问权限不能低于父类方法。
- 重写的方法不能抛出比父类方法更多或更广泛的异常。
案例:
在Dog
类中重写eat
方法,使其行为与父类Animal
中的eat
方法不同。
// 父类:Animal
public class Animal {
protected String name;
public void eat() {
System.out.println(name + " is eating.");
}
public void sleep() {
System.out.println(name + " is sleeping.");
}
}
// 子类:Dog
public class Dog extends Animal {
@Override
public void eat() {
System.out.println(name + " is eating dog food.");
}
public void bark() {
System.out.println(name + " is barking.");
}
}
// 测试类
public class OverrideTest {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.name = "Buddy";
myDog.eat(); // 调用子类重写的方法
myDog.sleep(); // 调用父类的方法
myDog.bark(); // 调用子类的方法
}
}
程序说明:
Dog
类重写了Animal
类的eat
方法,使得Dog
对象调用eat
方法时输出不同的内容。@Override
注解用于标识方法重写,帮助编译器检查是否正确重写父类方法。
2.2 super关键字
super
关键字用于引用父类的属性和方法,尤其在子类重写父类方法时,super
可以调用父类的版本。
案例:
在子类中调用父类的eat
方法。
// 子类:Dog
public class Dog extends Animal {
@Override
public void eat() {
super.eat(); // 调用父类的eat方法
System.out.println(name + " is eating dog food.");
}
public void bark() {
System.out.println(name + " is barking.");
}
}
// 测试类
public class SuperTest {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.name = "Buddy";
myDog.eat(); // 调用子类重写的方法,其中包含父类的行为
}
}
程序说明:
super.eat()
调用了Animal
类中的eat
方法,之后在子类Dog
的eat
方法中追加了特定行为。- 通过
super
,子类可以复用父类方法的功能,同时扩展或修改其行为。
3. 多态的基本概念与应用
3.1 多态的概念
多态(Polymorphism)是OOP的核心特性之一,指的是同一个方法在不同对象中表现出不同的行为。在Java中,多态通过方法重写和接口实现得以实现。
多态的表现形式:
- 方法重写中的多态:子类对象可以被当作父类对象使用,调用父类方法时,会执行子类重写后的版本。
- 接口中的多态:一个对象可以实现多个接口,调用接口方法时,会执行该对象实现的具体方法。
多态的优点:
- 代码灵活性:通过多态,代码可以处理父类引用的不同子类对象,增加了代码的灵活性。
- 可扩展性:在不修改现有代码的前提下,可以添加新的子类,并让它们在多态环境中工作。
3.2 多态的实现
案例:
演示多态如何在父类引用指向不同子类对象时表现出不同的行为。
// 父类:Animal
public class Animal {
public void makeSound() {
System.out.println("Animal is making a sound");
}
}
// 子类:Dog
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog is barking");
}
}
// 子类:Cat
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat is meowing");
}
}
// 测试类
public class PolymorphismTest {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.makeSound(); // 输出:Animal is making a sound
myDog.makeSound(); // 输出:Dog is barking
myCat.makeSound(); // 输出:Cat is meowing
}
}
程序说明:
- 父类
Animal
定义了makeSound
方法。 Dog
和Cat
类分别重写了makeSound
方法。- 在
PolymorphismTest
中,Animal
类型的引用可以指向不同的子类对象,并调用对应子类的makeSound
方法,表现出多态行为。
3.3 多态的应用场景
多态广泛应用于Java开发中的各个领域,尤其是在设计模式、框架和库中。以下是一些常见的应用场景:
- 设计模式:例如策略模式(Strategy Pattern)中
,通过多态实现不同策略的切换。
- 集合框架:Java集合框架中,
List
、Set
等接口可以通过多态的方式实现不同的数据结构,如ArrayList
、LinkedList
等。 - 事件驱动:在事件驱动的编程中,多态允许不同的事件处理程序在同一接口下工作。
案例:
通过多态实现一个简单的动物园管理系统,可以扩展更多的动物类型,而不需要修改现有代码。
import java.util.ArrayList;
import java.util.List;
public class Zoo {
private List<Animal> animals = new ArrayList<>();
public void addAnimal(Animal animal) {
animals.add(animal);
}
public void makeAllSounds() {
for (Animal animal : animals) {
animal.makeSound();
}
}
public static void main(String[] args) {
Zoo zoo = new Zoo();
zoo.addAnimal(new Dog());
zoo.addAnimal(new Cat());
zoo.addAnimal(new Animal());
zoo.makeAllSounds();
}
}
程序说明:
Zoo
类包含一个List<Animal>
,可以存储不同类型的动物对象。addAnimal
方法通过多态允许添加不同的动物类型。makeAllSounds
方法遍历所有动物,并调用它们的makeSound
方法,体现了多态的威力。
4. 深入剖析:多态的实现机制
多态在Java中通过动态绑定(也称为后期绑定)实现。动态绑定指的是在程序运行时根据对象的实际类型决定调用哪个方法,而非在编译时确定。这使得同一个方法调用在不同对象上表现出不同的行为。
案例:
演示方法的动态绑定。
class Parent {
void show() {
System.out.println("Parent's show()");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("Child's show()");
}
}
public class DynamicBindingTest {
public static void main(String[] args) {
Parent obj = new Child();
obj.show(); // 调用的是Child类的show()方法
}
}
程序说明:
- 尽管
obj
的类型在编译时是Parent
,但由于obj
实际指向的是Child
对象,因此在运行时调用的是Child
类的show
方法。 - 动态绑定确保了程序的灵活性和可扩展性,方法调用根据对象的实际类型动态决定。
5. 小结
今天我们学习了Java中的继承与多态,了解了继承的概念与实现、方法重写与super
关键字的使用,以及多态的基本概念与应用。掌握这些知识将帮助你编写更加灵活、可扩展的Java程序。
下期内容预告
在下一期中,我们将探讨Java中的抽象类与接口,了解如何通过抽象类和接口设计更加通用的代码,以及它们在实际开发中的应用。敬请期待!
如果你有任何问题或需要进一步帮助,请随时告诉我!
🧧🧧 福利赠与你 🧧🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「49天精通Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
-End-