Java函数:如何使用继承和多态?
Java是一种面向对象的编程语言,面向对象的编程的一个重要特征就是继承和多态。Java中的继承和多态都是通过函数实现的。在Java中,父类和子类之间可以共享函数,子类可以使用父类的函数,父类的函数也可以被子类使用。这种共享可以提高代码的复用性和可维护性。本文将从继承和多态的概念、继承和多态的实现方法以及继承和多态的应用等方面介绍Java中的继承和多态。
一、继承和多态的概念
继承是指一个类从另一个类获得其属性和方法,被继承的类称为父类(或超类、基类),继承的类称为子类(或派生类)。子类可以覆盖(或重载)父类的属性和方法,也可以增加自己的新属性和方法,但是不能去掉父类的属性和方法。在Java中,使用extends关键字表示一个类继承另一个类。例如:
public class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
}
public class Dog extends Animal {
public void bark() {
System.out.println("狗在汪汪叫");
}
}
在上面的代码中,Dog类继承了Animal类,因此可以调用父类的eat方法,同时增加自己的bark方法。
多态是指一个对象变成多个类型的能力。在Java中,多态可以通过重载(overloading)和覆盖(overriding)实现。重载是指在一个类中定义多个方法,方法名相同但参数类型和个数不同,可以根据不同的参数调用不同的方法。覆盖是指子类定义与父类同名、同参数、同返回类型的方法,并且不能调用父类的该方法,只能调用自己的该方法。多态可以提高代码的灵活性和可扩展性。例如:
public class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
}
public class Dog extends Animal {
public void eat() {
System.out.println("狗在吃骨头");
}
}
public class Cat extends Animal {
public void eat() {
System.out.println("猫在吃鱼");
}
}
在上面的代码中,Animal类定义了一个eat方法,Dog类和Cat类都继承了Animal类并覆盖了eat方法,调用不同的对象的eat方法可以得到不同的输出结果。
二、实现继承和多态的方法
Java中实现继承和多态的方法主要有三种:继承、抽象类和接口。
1. 继承
继承是最基本的面向对象编程的实现方式,可以通过extends关键字实现。在继承中,父类中的方法和属性被子类继承,可以被子类直接使用。但是继承有一个缺点,它可能导致类的层次结构过于庞大,影响程序的可读性和扩展性。例如:
public class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
}
public class Dog extends Animal {
public void bark() {
System.out.println("狗在汪汪叫");
}
}
public class Cat extends Animal {
public void mew() {
System.out.println("猫在喵喵叫");
}
}
在上面的代码中,Dog类和Cat类都继承了Animal类,如果再有其他的动物类,将会导致类的层次结构越来越庞大。
2. 抽象类
抽象类是指没有实现的类,只有方法定义的类。抽象类不能直接进行实例化,必须由子类继承并实现其中的抽象方法。抽象类可以定义抽象方法、普通方法、变量和常量等。在Java中,抽象类使用abstract关键字修饰。例如:
public abstract class Animal {
public abstract void eat();
}
public class Dog extends Animal {
public void eat() {
System.out.println("狗在吃骨头");
}
}
public class Cat extends Animal {
public void eat() {
System.out.println("猫在吃鱼");
}
}
在上面的代码中,Animal类是抽象类,其中定义了一个抽象方法eat,Dog类和Cat类都继承了Animal类并实现了eat方法。如果有新的动物需要添加,只需要继承Animal类并实现eat方法即可。
3. 接口
接口是抽象类的一种特殊形式,接口中只包含抽象方法和常量,不能包含变量和普通方法。接口可以被实现(implements)或继承(extends),被实现的接口必须被实现其中的所有方法,并且可以实现多个接口,被继承的接口可以被子接口继承,子接口可以增加新的方法或常量。在Java中,接口使用interface关键字修饰。例如:
public interface Animal {
void eat();
}
public class Dog implements Animal {
public void eat() {
System.out.println("狗在吃骨头");
}
}
public class Cat implements Animal {
public void eat() {
System.out.println("猫在吃鱼");
}
}
在上面的代码中,Animal接口定义了一个eat方法,Dog类和Cat类都实现了Animal接口并实现了eat方法。如果有新的动物需要添加,只需要实现Animal接口并实现eat方法即可。
三、继承和多态的应用
在Java中,继承和多态有着广泛的应用,以下是几个例子:
1. 编写通用代码
通过继承和多态可以编写通用代码,提高代码的复用性和可维护性。例如:
public abstract class Shape {
public int x;
public int y;
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
public abstract double getArea();
}
public class Circle extends Shape {
public int r;
public Circle(int x, int y, int r) {
super(x, y);
this.r = r;
}
public double getArea() {
return 3.14 * r * r;
}
}
public class Rectangle extends Shape {
public int w;
public int h;
public Rectangle(int x, int y, int w, int h) {
super(x, y);
this.w = w;
this.h = h;
}
public double getArea() {
return w * h;
}
}
在上面的代码中,Shape类是一个抽象类,Circle类和Rectangle类都继承了Shape类并实现了其中的抽象方法,定义了各自的图形对象。如果需要增加其他的图形对象,只需要继承Shape类并实现其中的抽象方法即可,提高代码的可扩展性。
2. 处理集合对象
在Java中,集合对象可以使用多态来处理,例如:
List<Animal> animals = new ArrayList<>();
animals.add(new Dog());
animals.add(new Cat());
for (Animal animal : animals) {
animal.eat();
}
在上面的代码中,定义了一个List集合对象,其中存储了Dog和Cat对象,可以通过foreach语句遍历集合中的对象,调用各自的eat方法。
3. 实现回调函数
通过继承和多态可以实现回调函数,
