IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 用Java编程模拟主人与狗的关系,主人能找到自己的小狗,小狗能找到自己的主人,小狗能讨好主人,升级版主人能养多条小狗并且能转让或接收小狗。 -> 正文阅读

[Java知识库]用Java编程模拟主人与狗的关系,主人能找到自己的小狗,小狗能找到自己的主人,小狗能讨好主人,升级版主人能养多条小狗并且能转让或接收小狗。

昨天我帮助一位网友解决了用Java编程模拟主人与狗的关系,我在编写代码过程中觉得这个很有趣,所以今天我想和大家分享一下。

问题是这样的:用Java编程模拟主人与狗的关系,主人能找到自己的小狗,小狗能找到自己的主人,小狗能讨好主人,这个是初级版本,还有一个升级版本,就是在初级版本上添加了这些条件:一个主人能养多只小狗(但是每个主人养的小狗数量是有限的),主人能转让自己的任意一条小狗(没有的话就不能转让),新主人可以接收小狗(新主人收养小狗的数量满了就不能接收了)

首先让我先分析一下初级版本的题目:看完这题目,我们发现就只有主人和小狗,

小狗的特点:有主人,能找到主人,能讨好主人,当然它也有自己的名称和类型;

主人的特点:有小狗,能找到小狗,当然主人也有自己的名称。

我们从上面的主人和小狗的特点中发现小狗中有主人的实例,主人中有小狗的实例(这种关系就是关联关系)。

依据这些特点我创建了Dog类

public class Dog {
 ? ?//小狗的名称
 ? ?private String name;
 ? ?//小狗的种类
 ? ?private String type;
 ? ?//小狗的主人
 ? ?private People master;
 ? ?//方法:讨好主人
 ? ?public void happy() {
 ? ? ? ?System.out.println(name + "讨好主人" + master.getName());
 ?  }
?
 ? ?//显示小狗的信息
 ? ?@Override
 ? ?public String toString() {
 ? ? ? ?return "小狗:" + name + "类型:"+type+"主人是:" + master.getName();
 ?  }
}

People类

public class People {
 ? ?//主人的名称
 ? ?private String name;
 ? ?//主人的宠物
 ? ?private Dog pet;
 ? ?//显示主人的信息
 ? ?@Override
 ? ?public String toString() {
 ? ? ? ?return "主人:" + name + "有一条狗叫" + pet.getName() 
        + "品种是" + pet.getType();
 ?  }
}

测试:

public static void main(String[] args) {
 ? ? ? ?//创建一个小狗对象
 ? ? ? ?Dog dog=new Dog("二哈","哈士奇");
 ? ? ? ?//创建一个主人对象
 ? ? ? ?People master=new People("coco");
 ? ? ? ?//设置小狗的主人
 ? ? ? ?dog.setMaster(master);
 ? ? ? ?//设置主人的小狗
 ? ? ? ?master.setPet(dog);
 ? ? ? ?//小狗讨好主人
 ? ? ? ?dog.happy();
 ? ? ? ?//显示信息
 ? ? ? ?System.out.println(dog);
 ? ? ? ?System.out.println(master);
 ?  }

分析升级版问题:从升级版的问题来看,Dog类没有改变,只是People类改变了。

改变后的主人的特点:能养多条小狗,能够转让小狗,能够接收小狗,当然主人也有自己的姓名。

依照这些特点我们创建了People类,由于每个主人养的小狗的数量可能相同也可能不同,所以我们不能写一个固定长度的“小狗数组”(我这里在setDogNumber的方法中对数组初始化,当然如果大家想在创建对象时对数组初始化也可以,在构造器中对数组进行初始化)

public class People {
 ? ?//主人的名称
 ? ?private String name;
 ? ?//主人的宠物
 ? ?private Dog[] pet;
 ? ?//宠物个数
 ? ?private int dogNumber;
 ? ?//初始化数组
 ? ? public void setDogNumber(int dogNumber) {
 ? ? ? ?this.dogNumber = dogNumber;
 ? ? ? ?pet = new Dog[dogNumber];
 ?  }
 ? ? //显示主人的信息
 ? ?@Override
 ? ?public String toString() {
 ? ? ? ?return "主人:" + name + "可以有" + dogNumber + "条狗";
 ?  }

转让小狗:思路是先判断主人是否养的有小狗,再看主人是否有要转让的小狗,这里转让小狗(删除小狗)的操作是基于数组的拷贝,注意数组拷贝完后要把数组的最后一位设置位null。

//转让小狗
public boolean transfer(Dog d) {
 //判断主人是否有小狗
 if (Objects.nonNull(pet)) {
 ? ?for (int i = 0; i < pet.length; i++) {
 ? ? ? ?Dog g = pet[i];
 ? ? ? ? //看主人是否有要转让的小狗
 ? ? ? ? if (Objects.equals(g, d)) {
 ? ? ? ? ??//转让小狗
 ? ? ? ? ? System.arraycopy(pet, i + 1, pet, i, pet.length - 1 - i);
 ? ? ? ? ? //把数组的最后一位设置位null
 ? ? ? ? ? pet[pet.length - 1] = null;
 ? ? ? ? ? return true;
 ? ? ? ? ? }
 ? ? ? ?}
 ? ? }
 ? ? return false;
 }

接收小狗:思路是判断主人还能养多余的小狗(添加小狗)

 //接受小狗
 ? ?public boolean receive(Dog d) {
 ? ? ? ?for (int i = 0; i < pet.length; i++) {
 ? ? ? ? ? ?Dog g = pet[i];
 ? ? ? ? ? ?if (Objects.isNull(g)) {
 ? ? ? ? ? ? ? ?pet[i] = d;
 ? ? ? ? ? ? ? ?return true;
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?return false;
 ?  }

测试:

//为小狗设置主人,为主人设置小狗 ?
public static void recognize(People master, Dog dog) {
 ? ? ? ?master.receive(dog);
 ? ? ? ?dog.setMaster(master);
 ?  }
//转让
public static void zhuanRang(People master1, Dog dog, People master2) {
 ? ? ? ?if (master1.transfer(dog)) {
 ? ? ? ? ? ?if (master2.receive(dog)) {
 ? ? ? ? ? ? ? ?System.out.println(master1.getName() + "将" 
     + dog.getName() + "转让给" + master2.getName());
 ? ? ? ? ?  } else {
 ? ? ? ? ? ? ? ?System.out.println("转让失败");
 ? ? ? ? ?  }
 ? ? ?  } else {
 ? ? ? ? ? ?System.out.println("转让失败");
 ? ? ?  }
?
 ?  }
//显示
public static void showDog(People master) {
 ? ? ? ?System.out.println("名称是:");
 ? ? ? ?for (Dog dog : master.getPet()) {
 ? ? ? ? ? ?if (Objects.nonNull(dog)) {
 ? ? ? ? ? ? ? ?System.out.print(dog.getName() + "\t");
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?System.out.println();
 ?  }
public static void test() {
 ? ? ? ?People master1 = new People("merry");
 ? ? ? ?master1.setDogNumber(3);
 ? ? ? ?People master2 = new People("jack");
 ? ? ? ?master2.setDogNumber(2);
 ? ? ? ?Dog dog1 = new Dog("小花", "哈士奇");
 ? ? ? ?Dog dog2 = new Dog("小黄", "泰迪");
 ? ? ? ?Dog dog3 = new Dog("小红", "哈士奇");
 ? ? ? ?Dog dog4 = new Dog("花花", "金巴");
 ? ? ? ?recognize(master1, dog1);
 ? ? ? ?recognize(master1, dog2);
 ? ? ? ?recognize(master1, dog3);
 ? ? ? ?recognize(master2, dog4);
 ? ? ? ?System.out.println(master1);
 ? ? ? ?showDog(master1);
 ? ? ? ?System.out.println(dog1);
 ? ? ? ?System.out.println(master2);
 ? ? ? ?showDog(master2);
 ? ? ? ?System.out.println(dog4);
 ? ? ? ?zhuanRang(master1, dog2, master2);
 ? ? ? ?zhuanRang(master2, dog4, master1);
 ?  }

总结:

主人与狗的关系是关联关系:在一个类中将另一个类的对象作为成员变量声明。这个问题的简单版:只需要我们懂得主人与狗的关系是关联关系,就能轻松解决。问题的升级版:我们只需要向People类中加入转让和接收的方法就行,转让只要我们懂得数组拷贝就能解决不过要注意拷贝完后要把数组最后一位设置为null,接收小狗需要判断数组是否已满,对于主人能养宠物数目的初始化操作,可以在构造器中初始化,也可以在setDogNumber(int dogNumber)中初始化

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章           查看所有文章
加:2021-08-06 15:54:59  更:2021-08-06 15:55:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 17:19:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码