继承
父类:被继承的类
子类:继承父类的类,可以访问父类的公有和保护成员。
extends:使用 extends
关键字来表示一个类继承另一个类。
方法重写:子类可以重写父类的方法,以提供特定的实现。重写的方法必须与父类中的方法具有相同的名称、返回类型和参数列表。
// 父类class Animal {public void eat() {System.out.println("This animal eats food.");}public void sound() {System.out.println("Animal makes a sound");}}// 子类class Dog extends Animal {// 重写父类的方法@Overridepublic void eat() {System.out.println("The dog eats bones.");}public void bark() {System.out.println("wangwangwang.");}public void sound() {super.sound(); // 调用父类的方法 superSystem.out.println("Dog barks"); // 子类的实现}}// 主类class Inheritance {public static void main(String[] args) {Dog myDog = new Dog();myDog.eat(); // 调用重写的方法myDog.bark(); // 调用子类的方法myDog.sound(); // 调用子类的方法,间接调用父类的方法}}
多态
多态:它允许一个接口或方法以多种形式存在。使得同一方法在不同对象上具有不同的行为。这种特性通常通过方法重写和接口实现来实现。
多态类型:编译时多态(静态多态)和运动时多态(动态多态)
静态多态
通过方法重载(同一个方法名,但参数列表不同)实现。
public class MathUtils {public int add(int a, int b) {return a + b;}public double add(double a, double b) {return a + b;}}
动态多态
通过方法重写实现。子类可以重写父类的方法,以提供不同的实现。在运行时,根据对象的实际类型调用相应的方法。
假设有一个动物园管理系统,让所有动物都能发出声音。通过多态,可以用一个通用的方法处理所有动物,而不需要知道具体的动物类型。
public class Animal {public void sound() {System.out.println("Animal makes a sound");}}public class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}}public class Cat extends Animal {@Overridepublic void sound() {System.out.println("Cat meows");}}public class Main {public static void makeAnimalSound(Animal animal) {animal.sound(); // 调用具体的声音方法}public static void main(String[] args) {Animal myDog = new Dog();Animal myCat = new Cat();makeAnimalSound(myDog); // 输出: Dog barksmakeAnimalSound(myCat); // 输出: Cat meows}}public class Main {public static void main(String[] args) {Animal[] animals = { new Dog(), new Cat() };for (Animal animal : animals) {animal.sound(); // 每个动物会调用自己的 sound 方法}}}
支持接口和抽象类
interface Shape {void draw();}class Circle implements Shape {public void draw() {System.out.println("Drawing a circle");}}class Rectangle implements Shape {public void draw() {System.out.println("Drawing a rectangle");}}public class Main {public static void main(String[] args) {Shape[] shapes = { new Circle(), new Rectangle() };for (Shape shape : shapes) {shape.draw(); // 每个形状会调用自己的 draw 方法}}}
增强可扩展性
假设想要添加一个新形状,例如三角形,只需实现 Shape
接口,而不需要修改任何使用 Shape
的代码。
class Triangle implements Shape {public void draw() {System.out.println("Drawing a triangle");}}public class Main {public static void main(String[] args) {Shape[] shapes = { new Circle(), new Rectangle(), new Triangle() };for (Shape shape : shapes) {shape.draw(); // 输出: Drawing a circle, Drawing a rectangle, Drawing a triangle}}}
多态与继承的区别
-
继承:创建类的层次结构,使得子类能够访问父类的属性和方法。
-
是一种类与类之间的关系,子类继承父类的属性和方法
-
主要用于重用和组织结构。
-
-
多态:是通过父类引用指向子类对象来实现灵活的行为,允许不同的子类以相同的方式被处理,但表现出不同的行为。
-
是指同一个方法在不同对象上表现出不同的行为。
-
主要依赖于方法重写和父类引用指向子类对象的特性。
-
允许在运行时根据对象的实际类型决定调用哪个方法。
-
继承是实现多态的基础,而多态则是利用继承的一种机制,使得代码更加灵活和可扩展。
阻止继承
采用final声明。
不允许拓展的类被称为final类。
类中的特定方法也可以被声明为final。这样子类就不能重写这个方法了。
final类中的所有方法自动成为final方法(只有方法不包括域)。
例如:String类就是一个final类。
public final class Dog extends Anmails{//.....}
protected
JAVA的4种访问修饰符:
-
private:仅对本类可见
-
public:对所有类可见
-
protected:对本包和所有子类可见
-
不需要修饰符:对本包可见