摘自《java开发实战经典》李兴华.著

一对多的关系

一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,此时就可以通过类集进行关系的表示。

在定义Student类中包含了一个School属性,表示一个学生属于一个学校。在程序运行时,只需要传入School类的引用就可以完成这样的关系。

在定义School类时定义了一个List类型的属性,并指定其泛型类型是Student类型,这样一来就表示在一个School对象中会包含多个Student类型的引用。

最后在主函数设置学校和学生的对应关系。也可以用Map来实现学校映射学生的list集合之间的关系。

 import java.util.*;
public class TestDemo{//设置学校和学生的关系
public static void main(String args[]){
School sch = new School("清华大学") ;//实例化学校对象
Student s1 = new Student("张三",21) ;//实例化学生对象
Student s2 = new Student("李四",22) ;
Student s3 = new Student("王五",23) ;
sch.getAllStudents().add(s1) ;//在学校中加入学生
sch.getAllStudents().add(s2) ;
sch.getAllStudents().add(s3) ;
s1.setSchool(sch) ;//一个学生属于一个学校
s2.setSchool(sch) ;
s3.setSchool(sch) ;
System.out.println(sch) ;
Iterator<Student> iter = sch.getAllStudents().iterator() ;
while(iter.hasNext()){
System.out.println("\t|- " + iter.next()) ;
}
}
} //学生类
class Student{
private String name ;
private int age ;
private School school; // 一个学生属于一个学校
public Student(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public void setSchool(School school){
this.school = school ;
}
public School getSchool(){
return this.school ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age ;
}
public String toString(){
return "学生姓名:" + this.name + ";年龄:" + this.age ;
}
} //学校类
class School{
private String name ;
private List<Student> allStudents ;//一个学校有多个学生
public School(String name){
this.allStudents = new ArrayList<Student>();
this.setName(name) ;
}
public void setName(String name){
this.name = name ;
}
public String getName(){
return this.name;
}
public List<Student> getAllStudents(){//取得全部的学生
return this.allStudents ;
}
public String toString(){
return "学校名称:" + this.name ;
}
}

多对多关系

使用类集不仅可以表示出一对一的关系,也可以表示出多对多的关系。例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系。

要完成本程序,首先应该定义两个类:学生信息类Student、课程信息类Course。在一个学生类中存在一个集合,保存全部的课程;而在课程类中也要存在一个集合,保存全部的学生。

 import java.util.*;
// 定义学生类
class Student {
private String name ;
private int age ;
private List<Course> allCourses ; // 定义集合保存全部课程
public Student(){// 无参构造
this.allCourses = new ArrayList<Course>() ;// 实例化List集合
}
public Student(String name,int age){ // 通过构造设置属性内容
this() ; // 调用无参构造
this.setName(name) ; // 设置name属性内容
this.setAge(age) ; // 设置age属性内容
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<Course> getAllCourses() { // 取得全部课程
return allCourses;
}
public String toString(){ // 覆写toString()方法
return "学生姓名:" + this.name + ";年龄:" + this.age ;
}
} //在学生类中存在一个allCourses的List集合,这样在程序运行时,一个学生类中可以保存多个Course对象。 //定义课程类
class Course {
private String name ; //
private int credit ; // 定义学分
private List<Student> allStudents ; // 定义集合保存多个学生
public Course(){ // 无参构造方法
this.allStudents = new ArrayList<Student>() ;// 实例化List集合
}
public Course(String name,int credit){ //
this() ;
this.setName(name) ;
this.setCredit(credit) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCredit() {
return credit;
}
public void setCredit(int credit) {
this.credit = credit;
}
public List<Student> getAllStudents() { // 得到全部学生
return allStudents;
}
public void setAllStudents(List<Student>allStudents) {// 设置全部学生
this.allStudents = allStudents;
}
public String toString(){
return "课程名称:" + this.name + ";课程学分" + this.credit ;
}
} //课程类与学生类一样,都定义了一个List集合,用于保存多个学生信息。 public class TestMore {
public static void main(String args[]) {
Course c1 = new Course("英语", 3); // 实例化课程对象
Course c2 = new Course("计算机", 5);
Student s1 = new Student("张三", 20); // 实例化学生对象
Student s2 = new Student("李四", 21);
Student s3 = new Student("王五", 22);
Student s4 = new Student("赵六", 23);
Student s5 = new Student("孙七", 24);
Student s6 = new Student("钱八", 25);
// 第一门课程有3个人参加,向课程中增加3个学生信息,同时向学生中增加课程信息
c1.getAllStudents().add(s1); // 向课程增加学生信息
c1.getAllStudents().add(s2);
c1.getAllStudents().add(s6);
s1.getAllCourses().add(c1); // 向学生中增加课程信息
s2.getAllCourses().add(c1);
s6.getAllCourses().add(c1);
// 第二门课程有6个人参加,向课程中增加6个学生信息,同时向学生中增加课程信息
c2.getAllStudents().add(s1); // 向课程增加学生信息
c2.getAllStudents().add(s2);
c2.getAllStudents().add(s3);
c2.getAllStudents().add(s4);
c2.getAllStudents().add(s5);
c2.getAllStudents().add(s6);
s1.getAllCourses().add(c2);// 向学生中增加课程信息
s2.getAllCourses().add(c2);
s3.getAllCourses().add(c2);
s4.getAllCourses().add(c2);
s5.getAllCourses().add(c2);
s6.getAllCourses().add(c2);
// 输出一门课程的信息,观察一门课程有多少个学生参加
System.out.println(c1); // 输出第一门课程信息
Iterator<Student> iter1 = c1.getAllStudents().iterator();
while (iter1.hasNext()) { // 迭代
Student s = iter1.next();// 取出学生对象
System.out.println("\t|- " + s); // 输出学生信息
}
// 输出一个学生参加的课程信息,观察有多少门课程
System.out.println(s6); // 输出学生信息
Iterator<Course> iter2 = s6.getAllCourses().iterator();
while (iter2.hasNext()) { // 迭代
Course c = iter2.next(); // 取得所参加的课程
System.out.println("\t|- " + c); // 输出课程信息
}
}
}
---------- java ----------
课程名称:英语;课程学分3
|- 学生姓名:张三;年龄:20
|- 学生姓名:李四;年龄:21
|- 学生姓名:钱八;年龄:25
学生姓名:钱八;年龄:25
|- 课程名称:英语;课程学分3
|- 课程名称:计算机;课程学分5 输出完成 (耗时 0 秒) - 正常终止

java类集开发中一对多和多对多的关系的实现的更多相关文章

  1. Java:类集框架中集合的学习

    Java:类集框架中集合的学习 集合 Java:Set的学习 Set是类集框架中的集合类.集合是不按特定的方式排序,并且没有重复对象的一种类. Q:Set如何操作?Set中的不按特定方式排序是怎么排序 ...

  2. 专题笔记--Java 类集框架

    Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...

  3. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  4. java:类集操作总结

    java:类集操作总结 1.List接口允许有重复的元素,Set接口中不允许有重复的元素 2.ArrayList,和Vector的区别 3.set依靠equals和hashCode区分 4.TreeS ...

  5. 浅谈java类集框架和数据结构(1)

    在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...

  6. Java Web应用开发中的一些概念

    最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...

  7. Java类集框架详细汇总-底层分析

    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...

  8. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  9. java:类集操作,多对多的关系

    java:类集操作,多对多的关系 //一个课程有多个学生报名, //一个学生可以报名多个课程 demo.java, Student.java, Course.java' public class Co ...

随机推荐

  1. Nginx Location配置总结

    Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...

  2. 转:Unknown module(s) in QT: multimedia

    在编写串口时遇到了以下问题:Unknown module(s) in QT: multimedia 在ubuntu中解决方法如下: qtmultimedia5-de sudo apt-get inst ...

  3. JavaWeb 学习003-简单登录页面功能实现

    先说下题外话:学习不是看你学了多久,重点是学到多少: 这就要求   效率.我在这三个小时,但是有效率的又有多久?只是做了这么一点简单的事. 登录页面 跟数据库交互,进行判断是否登陆成功.我只是实现了一 ...

  4. Hibernate一对一双向关联(注解)

    每一个人(Person)对应一个身份证号(IdCard) package cqvie.yjq.domain; import java.util.Date; import javax.persisten ...

  5. jdk安装和环境变量配置

    jdk的安装和环境变量配置每次换新环境都在做,但是每次都没有认真去想是怎么做的,反正每次打开百度搜索照做就是.这次整理一下,也顺便理清一下其中的原理. 1.第一步当然就是下载jdk,我这边下载的是jd ...

  6. Android开发工具全面转向Android Studio(2)——AS project/module的CRUD

    本文有些地方可能需要衔接Android开发工具全面转向Android Studio(1)——准备开发环境,读起来效果会更好. 这个世界很奇妙,所有的东西离不开CRUD,即增删改查.即使人本身也遵循这个 ...

  7. textField和textView限制输入条件

    以下两法方法都是实现textfield和textView的代理方法  需要先遵循代理 一:textField限制只能输入数字和小数点 且小数点后只能保留两位 小数点前最多5位 - (BOOL)text ...

  8. ReportViewer内存泄漏问题解决方案[上]

    做这个项目有点倒霉,快要验收的时候,发现微软ReportViewer控件的一个bug,导致我们的项目无法正常验收. 问题描叙:用ReportViewer本地模式做的报表,在ASP.NET页面中呈现.在 ...

  9. sublime Text 的安装、破解、汉化、使用

    Sublime Text 3安装与使用   本文是Sublime Text 全程指引 by Lucida (http://www.cnblogs.com/figure9/p/sublime-text- ...

  10. HTML5 CSS3学习

    HTML5 CSS3学习 :http://www.1000zhu.com/course/css3/ HTML5 相关书籍:   http://www.html5cn.com.cn/news/gdt/2 ...