组合和继承的区别代码实列
时间: 2023-06-09 16:03:47 浏览: 62
组合(Composition)和继承(Inheritance)是面向对象编程中常用的两种代码设计方式。
组合是指一个类中使用了另一个类的对象来完成自己的功能。这个对象作为成员变量被定义在类中,并且可以通过构造方法来初始化。组合强调的是“拥有”的关系,假设类A中使用了类B对象来完成某些功能,那么类B就是A的一个组成部分,但B不是A的子类。
继承是指一个子类从一个父类中继承了所有成员变量和方法,并且可以在此之上扩展自己的功能。子类可以重写、覆盖掉父类中的方法,并且可以定义自己的新成员变量和方法。继承强调的是“是”的关系,如果类B是类A的子类,那么B就可以被看作是A的一种特殊情况。
下面是一个简单的实例,演示了组合和继承的区别:
```java
// 定义一个人的类
class Person {
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter和setter方法
// ...
// 定义一个说话的方法
public void speak(String message) {
System.out.println(name + "说: " + message);
}
}
// 定义一个学生的类,使用组合方式
class Student {
private Person person;
private String school;
// 构造方法
public Student(String name, int age, String school) {
person = new Person(name, age);
this.school = school;
}
// getter和setter方法
// ...
// 重新定义说话的方法
public void speak(String message) {
person.speak("我是学生," + message);
}
}
// 定义一个老师的类,使用继承方式
class Teacher extends Person {
private String school;
// 构造方法
public Teacher(String name, int age, String school) {
super(name, age);
this.school = school;
}
// getter和setter方法
// ...
// 重新定义说话的方法
public void speak(String message) {
super.speak("我是老师," + message);
}
}
// 测试
public class Test {
public static void main(String[] args) {
Student s = new Student("小明", 10, "中学");
s.speak("我学习很努力");
Teacher t = new Teacher("张老师", 30, "大学");
t.speak("下节课我们讲解继承和组合的区别");
}
}
```
在上面的代码中,我们定义了一个人的类Person,它有一个说话的方法。然后我们定义了一个学生的类Student,它使用了Person类的对象,并重新定义了说话的方法。这里我们使用了组合的方式。我们还定义了一个老师的类Teacher,它继承了Person类,并重写了说话的方法。这里我们使用了继承的方式。
通过这个实例,我们可以看到,组合和继承都可以实现代码的复用和扩展,但两种方式的语义和设计思路是不同的。在实际编程中,应该根据不同的需求来选择适合的方式。