目录
类的继承、方法的重写与重载
在Java编程中,类的继承、方法的重写与重载是面向对象编程的核心概念。这些特性使得代码可以更易于维护和扩展,同时也提高了代码的复用性和灵活性。
继承
继承的本质
继承是面向对象编程中的一种机制,允许一个类(子类)继承另一个类(父类)的属性和方法。继承的本质是为了实现代码的复用和扩展。通过继承,子类不仅可以使用父类中已有的方法和属性,还可以根据需要扩展新的方法和属性。
如何完成继承
在Java中,继承是通过extends关键字来实现的。子类通过声明extends 父类名来继承父类。例如:
class Parent {
void show() {
System.out.println("父类方法");
}
}
class Child extends Parent {
void display() {
System.out.println("子类方法");
}
}
Child dog = new Child();
dog.show(); // 调用父类的方法
dog.display(); // 调用子类的方法
格式
class 子类名 extends 父类名 {
// 子类自己的属性和方法
}
例子
父类:
class Animal {
void eat() {
System.out.println("动物吃饭");
}
}
子类:
class Dog extends Animal {
void bark() {
System.out.println("小狗在叫");
}
}
测试类:
public class ceshi {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 调用父类的方法
dog.bark(); // 调用子类的方法
}
}
运行结果:
继承层次
Java类不能互相继承
在Java中,一个类只能有一个直接的父类,不能同时继承多个父类。这意味着继承是单向的,一个子类不能有多个直接父类。
单继承与多子类
一个类可以作为多个子类的父类(即一个类可以被多个子类继承),但一个子类只能继承一个父类。这种机制称为单继承。也就是说,一个父类可以有多个子类(即“一个父亲可以有多个儿子”),但每个子类(“儿子”)只能有一个直接的父类(“父亲”)。
class Animal {
void eat() {
System.out.println("动物吃饭");
}
}
class Dog extends Animal {
void bark() {
System.out.println("小狗在汪汪");
}
}
class Cat extends Animal {
void meow() {
System.out.println("小猫在喵喵");
}
}
在这个例子中,Dog和Cat都是Animal的子类,说明Animal这个类可以被多个类作为父类继承(Dog和Cat),但Dog和Cat各自只能继承一个父类(即Animal),这体现了Java的单继承特性。
方法的重写与重载
什么是方法
方法是类中的一个功能块,它被定义来执行特定的任务。在Java中,方法通常由访问修饰符、返回类型、方法名和参数列表组成。
Java的修饰符
Java提供了多种修饰符来控制类及其成员的可见性和行为,如public、protected、private、default(包级私有)。这些修饰符决定了类成员的访问范围。
public
public修饰符可以应用于类、方法和成员变量。使用public修饰的类或成员可以被所有其他类访问,不论它们位于同一个包中还是不同的包中。
protected
protected修饰符适用于方法和成员变量。使用protected修饰的成员只能在同一个包内的类和其他包中的子类中访问。
default(无修饰符)
当没有指定任何访问修饰符时,默认使用包级别访问权限,称为default访问。default修饰符适用于类、方法和成员变量。使用default修饰的类或成员只能在同一个包内访问。
private
private修饰符用于成员变量和方法。使用private修饰的成员只能在其所在的类中访问。
方法的重载
方法的重载(Overloading)是指在同一个类中,可以定义多个方法名相同但参数列表不同的方法。这些方法可以有不同的参数数量或参数类型。
例子:
class lianxi {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
在这个例子中,add方法被重载了,一个方法接受两个整数作为参数,另一个接受两个双精度浮点数作为参数。
方法的重写
方法的重写是指子类提供了与父类方法相同名称和参数列表的方法,且返回类型必须兼容。重写是为了在子类中实现父类方法的特定行为。
例子:
class Animal {
void eat() {
System.out.println("动物吃饭");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("小狗吃饭");
}
}
为什么要进行重写
重写的主要目的是为了在子类中定制或扩展父类的方法行为。当父类的方法无法满足子类的需求时,可以通过重写该方法来提供适当的实现。例如,在一个动物的例子中,所有动物都有eat方法,但不同动物吃的方式不同,所以需要在每个具体的动物类中重写eat方法。