Java中类与类之间是什么关系?
1.依赖
依赖是指一个类(称为依赖类)使用到了另一个类(称为被依赖类),而这种使用关系是具有偶然性的、临时性的、非常弱的,但是被依赖类(目标类)的变化会影响到依赖类。
例如,比如人A要过河,需要借用一条船B,此时人A与船B之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个方法中使用
Boat 类
点击查看代码
package com.itcq.dependency;
/**
* Boat 类表示一艘带有名称的水上交通工具。
*/
public class Boat {
private String name;
/**
* 用指定的名称构造 Boat 对象。
*
* @param name 船的名称。
*/
public Boat(String name) {
this.name = name;
}
/**
* 获取船的名称。
*
* @return 船的名称。
*/
public String getName() {
return name;
}
/**
* 设置船的名称。
*
* @param name 船的新名称。
*/
public void setName(String name) {
this.name = name;
}
}
Person 类
点击查看代码
package com.itcq.dependency;
/**
* Person 类表示能够使用船渡河的个体。
*/
public class Person {
/**
* 使用指定的船渡河。
*
* @param boat 用于渡河的船。
*/
public void crossRiver(Boat boat){
System.out.println("我乘坐"+boat.getName()+"过河···");
}
}
App测试类
点击查看代码
package com.itcq.dependency;
/**
* App 类包含 main 方法,用于演示 Person 和 Boat 类之间的依赖关系。
*/
public class App {
public static void main(String[] args) {
// 创建 Person 的实例
Person person = new Person();
// 通过将 Boat 对象作为参数演示依赖关系
person.crossRiver(new Boat("传琦T-001"));
}
}
依赖关系的强弱:
依赖关系的强度取决于以下几个因素:
- 依赖的程度:如果一个类对另一个类的依赖程度高,则依赖关系更强。
- 耦合的程度:如果两个类之间的耦合度高,则依赖关系更强。
- 生命周期:如果两个类具有相同的生命周期,则依赖关系更强。
总结:
- 依赖关系是一种比较常见的类与类之间的关系。
- 依赖关系的强度取决于几个因素,包括依赖程度、耦合程度和生命周期。
其他示例:
Person
类依赖于Address
类,因为人需要住址。Order
类依赖于Product
类,因为订单包含商品。FileReader
类依赖于File
类,因为文件读取器需要读取文件。
依赖关系可以通过参数、成员变量、方法调用、配置文件等方式体现。选择哪种方式体现依赖关系,需要根据具体情况来决定。
2.关联
关联关系是指两个或多个类之间存在着一种相互依赖的关系,但这种依赖关系不是强依赖关系,而是弱依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向关联、双向关联。单向关联在代码层面表现为:类A当中使用了类B,其中B作为类A的成员变量。双向关联在代码层面表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。
例如:
双向关联:一个Student
类关联于Teacher
类,因为Student
类需要Teacher
类来进行教学,而Teacher
类也需要Student
类来进行教学。
Student类
点击查看代码
package com.itcq.association;
public class Student {
private String name;
private Teacher teacher;
public Student(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Teacher getTeacher() {
return teacher;
}
// 学生需要老师进行教学
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
// 学生的其他方法...
public void attendClass() {
System.out.println(name + "正在上课,老师是:" + teacher.getName());
}
}
Teacher类
点击查看代码
package com.itcq.association;
public class Teacher {
private String name;
private Student student;
public Teacher(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Student getStudent() {
return student;
}
// 老师需要学生进行教学
public void setStudent(Student student) {
this.student = student;
}
// 老师的其他方法...
public void conductClass() {
System.out.println(name + "正在授课,学生是:" + student.getName());
}
}
测试类App
点击查看代码
package com.itcq.association;
public class App {
public static void main(String[] args) {
// 创建学生和老师的实例
Student student = new Student("小明");
Teacher teacher = new Teacher("张老师");
// 建立相互关联
student.setTeacher(teacher);
teacher.setStudent(student);
// 学生上课
student.attendClass();//小明正在上课,老师是:张老师
// 老师授课
teacher.conductClass();//张老师正在授课,学生是:小明
}
}
单向关联:当一个类关联到另一个类,但另一个类不直接关联回来,就是单向关联。以下是一个示例,演示了Student
类关联到Teacher
类的单向关联:
Student类
点击查看代码
package com.itcq.association;
public class Student {
private String name;
private Teacher teacher;
public Student(){
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher getTeacher() {
return teacher;
}
// 学生需要老师进行教学
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
// 学生的其他方法...
public void attendClass() {
if (teacher != null) {
System.out.println(name + "正在上课,老师是:" + teacher.getName());
} else {
System.out.println(name + "正在上课,但尚未分配老师。");
}
}
}
Teacher类
点击查看代码
package com.itcq.association;
public class Teacher {
private String name;
public Teacher(){
}
public Teacher(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
// 老师的其他方法...
public String getName() {
return name;
}
}
App测试类
点击查看代码
package com.itcq.association;
public class App {
public static void main(String[] args) {
// 创建学生和老师的实例
Student student = new Student("小明");
Teacher teacher = new Teacher("张老师");
// 建立单向关联,学生关联到老师
student.setTeacher(teacher);
// 学生上课
student.attendClass();//小明正在上课,老师是:张老师
}
}
3.继承(泛化Generalization)
继承指的是一个类(称为子类(派生类)、子接口)继承另外的一个类(称为父类(基类)、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识
下面是一个使用继承关系的示例,其中有一个父类 Animal
,以及两个子类 Cat
和 Dog
。Cat
类继承自 Animal
,而 Dog
类也继承自 Animal
。每个类都有自己的方法 eat
来描述它们的饮食习惯。
Animal类
点击查看代码
package com.itcq.generalization;
// Animal 类作为父类
public class Animal {
private String name;
public Animal(){
}
public Animal(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
// eat 方法在父类中被定义,具体的实现在子类中完成
public void eat() {
System.out.println(name + "正在进食");
}
}
Cat类
点击查看代码
package com.itcq.generalization;
// Cat 类继承自 Animal 类
public class Cat extends Animal {
public Cat(){
super();
}
public Cat(String name) {
super(name);
}
// 重写父类的 eat 方法
@Override
public void eat() {
System.out.println(getName() + "正在吃鱼");
}
}
Dog类
点击查看代码
package com.itcq.generalization;
// Dog 类继承自 Animal 类
public class Dog extends Animal {
public Dog(){
super();
}
public Dog(String name) {
super(name);
}
// 重写父类的 eat 方法
@Override
public void eat() {
System.out.println(getName() + "正在吃肉");
}
}
App测试类
点击查看代码
package com.itcq.generalization;
public class App {
public static void main(String[] args) {
// 创建 Cat 和 Dog 实例
Cat cat = new Cat("小猫");
Dog dog = new Dog("小狗");
// 调用各自的 eat 方法
cat.eat(); // 输出:小猫正在吃鱼
dog.eat(); // 输出:小狗正在吃肉
}
}