java类关系
在java类之间,最常见的关系有:
- 依赖(“uses-a”)
- 聚合(“has-a”)
- 继承(“is-a”)
依赖
依赖(dependence),即“uses-a”关系,是一种最明显的、最常见的关系。是说一个类需要依赖与另一个类的属性和方法,如果一个类的方法操作另一个类的对象,那么我们就说一个类依赖于另一个类。下面我们看代码
- 我们先来创建一个学生类,拥有几个属性及其对应的getter和toString方法
/**
* 学生类
*/
public class Student {
private static Integer id = 0;
private String name;
private Integer age;
private String sex;
public Student(String name,Integer age,String sex){
id++;
this.name = name;
this.age = age;
this.sex = sex;
}
public static Integer getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public String getSex() {
return sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
- 再来创建一个班级类,班级类中需要使用(uses)这个学生类,可以向班级对象中添加学生,以及查询学生列表
/**
* 班级类
*/
public class Class {
private static Integer id = 0;
private String name;
private List<Student> students;
public Class(String name,List<Student> students){
students = new ArrayList<>();
id++;
this.name = name;
this.students = students;
}
/**
* 添加学生
* @param student
*/
void addStudnet(Student student){
students.add(student);
System.out.println(String.format("Class(id=%d)成功添加学生(name=%s)",Student.getId(),student.getName()));
}
/**
* 查询学生列表
* @return
*/
List<Student> queryStudents(){
return this.students;
}
@Override
public String toString() {
return "Class{" +
"name='" + name + '\'' +
", students=" + students +
'}';
}
public static void main(String[] args) {
Class c = new Class("班级", null);
for (int i=1;i<=10;i++){
Student s = new Student(String.format("楷楷%d号",i),20,"男");
c.addStudnet(s);
}
System.out.println(c.queryStudents());
}
}
输出结果:
Class(id=1)成功添加学生(name=楷楷1号)
Class(id=1)成功添加学生(name=楷楷2号)
Class(id=1)成功添加学生(name=楷楷3号)
Class(id=1)成功添加学生(name=楷楷4号)
Class(id=1)成功添加学生(name=楷楷5号)
Class(id=1)成功添加学生(name=楷楷6号)
Class(id=1)成功添加学生(name=楷楷7号)
Class(id=1)成功添加学生(name=楷楷8号)
Class(id=1)成功添加学生(name=楷楷9号)
Class(id=1)成功添加学生(name=楷楷10号)
[Student{id=10, name='楷楷1号', age='20', sex='男'}, Student{id=10, name='楷楷2号', age='20', sex='男'}, Student{id=10, name='楷楷3号', age='20', sex='男'}, Student{id=10, name='楷楷4号', age='20', sex='男'}, Student{id=10, name='楷楷5号', age='20', sex='男'}, Student{id=10, name='楷楷6号', age='20', sex='男'}, Student{id=10, name='楷楷7号', age='20', sex='男'}, Student{id=10, name='楷楷8号', age='20', sex='男'}, Student{id=10, name='楷楷9号', age='20', sex='男'}, Student{id=10, name='楷楷10号', age='20', sex='男'}]
可以看到,在班级类中的addStudent方法,使用到了类Student,那么这种关系我们就称之为依赖关系(uses-a)。
聚合
聚合(aggregation),即“has-a”关系,是一种具体且易于理解的关系,意味着一个包含的关系,即一个类实例中包含另外一个类
实例。
这个时候,我们再来设计一个老师类,每个学生拥有一个对应的老师,而老师是属于学生的,因此老师是学生的一个属性,如下
老师类
/**
* 老师类
*/
public class Teacher {
private static Integer id = 0;
private String name;
public Teacher(String name){
id++;
this.name = name;
}
public static Integer getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
'}';
}
}
学生类
/**
* 学生类
*/
public class Student {
private static Integer id = 0;
private String name;
private Integer age;
private String sex;
private Teacher teacher; // 这里就是聚合(has-a)关系
public Student(String name,Integer age,String sex,Teacher teacher){
id++;
this.name = name;
this.age = age;
this.sex = sex;
this.teacher = teacher;
}
public static Integer getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public String getSex() {
return sex;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", teacher=" + teacher +
'}';
}
public static void main(String[] args) {
Student s = new Student("楷楷",20,"男",null); // 创建学生实例,老师设为null
Teacher t = new Teacher("楷楷的老师"); // 创建老师实例
s.setTeacher(t); // 给学生设置老师
System.out.println(s); // 输出该学生
}
}
输出结果:
Student{name='楷楷', age=20, sex='男', teacher=Teacher{name='楷楷的老师'}}
上面的学生类,多了一个属性叫teacher,类型为Teacher类,那么这边就具有了一个聚合(has-a)的关系。
继承
继承(inheritance),即“is-a”关系,是一种用于表示特殊与一般关系的。这个是java中十分重要的一种类关系,有了继承就能在一个类的基础上,另外扩充其他的功能。由于java中继承的概念比较重要,我们下篇博客将继续详细介绍此种类关系。
To Be Continue