一、知识点(必做):

ObjectDemo.java

需求:演示Object类中的toString和equals方法

  • 创建一个Person类,通过覆盖toString方法,打印Person对象的内容
  • 使用和equals比较两个Person对象,通过结果得到和equals的区别

作业目的:

掌握Object类中的toString方法和equals方法

掌握==和equals的区别

  1. package _02_object;
  2. import java.util.Objects;
  3. public class Person {
  4. private int age;
  5. private String name;
  6. @Override
  7. public boolean equals(Object o) {
  8. if (this == o) return true;
  9. if (o == null || getClass() != o.getClass())
  10. return false;
  11. Person person = (Person) o;
  12. return age == person.age &&
  13. Objects.equals(name, person.name);
  14. }
  15. public int getAge() {
  16. return age;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public Person(int age, String name) {
  28. this.age = age;
  29. this.name = name;
  30. }
  31. public Person() {
  32. }
  33. @Override
  34. public String toString() {
  35. return "Person{" +
  36. "age=" + age +
  37. ", name='" + name + '\'' +
  38. '}';
  39. }
  40. }
  41. package _02_object;
  42. public class ObjectDemo3 {
  43. public static void main(String[] args) {
  44. //equal(Object obj):拿当前调用该方法的对象和参数obj作比较,比较这两个对象是否相等
  45. //基本数据类型的相等:比较变量的值是否相等
  46. int num1 = 10;
  47. int num2 = 20;
  48. System.out.println(num1 == num2);
  49. //引用数据类型相等:比较变量的值地址是否相等
  50. Person person1 = new Person();
  51. Person person2 = new Person();
  52. System.out.println(person1 == person2);//false
  53. /**
  54. * ==比较是否相等
  55. * 对于基本数据类型比较的是变量存储的值
  56. * 对于引用数据类型的是存储的地址
  57. */
  58. //所以说,实际开发过程中,对于引用数据类型,开发者在乎的一定是对象中字段的值是否相等
  59. //ctrl+鼠标单击
  60. boolean r ;
  61. r= person1.equals(person2);
  62. System.out.println("r= " + r);
  63. r= person1.equals(person1);
  64. System.out.println("r= " + r);
  65. System.out.println(person1);
  66. System.out.println(person1.toString());
  67. }
  68. }
  69. /*equals()拿当前调用该方法的对象和参数obj做比较,在Object类中的equals方法和“==”符号相同
  70. 都是比较对象是否是同一个存储地址
  71. toString():把对象中的字段信息转换成字符串格式,打印对象时其实打印的就是对象的toString方法
  72. 默认情况下打印的是对象的hashCode值,建议:应该把每个类都应该覆盖toString返回我们关心的数据
  73. ==比较是否相等,对于基本数据类型比较的是变量存储的值对于引用数据类型的是存储的地址
  74. equals比较字符串中所包含的内容是否相同

PolymorphismDemo(重点)

需求:定义一个青蛙类(Frog)继承于动物类(Animal),同时实现会走路(IWalkable),会游泳(ISwimable)的接口

作业目的:

  • 掌握接口的定义
  • 掌握接口和类之间的多实现关系
  1. package cn.wolfcode._03_poly3;
  2. public class Frog implements ISwimable {
  3. @Override
  4. public void swim() {
  5. Syspackage cn.wolfcode._03_poly3;
  6. public class Frog implements ISwimable,IWalkable{
  7. @Override
  8. public void swim() {
  9. System.out.println("青蛙本身就会蛙泳");
  10. }
  11. @Override
  12. public void walk() {
  13. System.out.println("青蛙本身就会走路");
  14. }
  15. }
  16. }
  17. }
  18. package cn.wolfcode._03_poly3;
  19. public interface ISwimable {
  20. void swim();
  21. }
  22. package cn.wolfcode._03_poly3;
  23. public interface IWalkable {
  24. void walk();
  25. }
  26. public class PolyDemo{
  27. public static void main(String[] args){
  28. ISwimable swimable =null;
  29. swimable = new Frog();
  30. swimable.swim();
  31. IWalkable walkable =null;
  32. walkable = new Frog();
  33. walkable.walk();
  34. }
  35. }
  36. /*总结: 接口定义:接口表示具有某些功能的事物,接口名使用名词
  37. 代码:public interface 接口名{
  38. 抽象方法1();
  39. 抽象方法2();
  40. 抽象方法3();
  41. 类是可以继承类,只能单继承,接口也可以继承接口,支持多继承,可以同时继承多个接口,当类实现接口后,覆盖接口中的抽象方法,完成功能代码:接口与实现类之间的关系:
  42. 接口:定义多个抽象方法,仅仅定义有哪些功能,却不提供实现
  43. 实现类:实现接口,覆盖接口中抽象方法,完成功能具体的实现,如果实现类没有全部实现接口中的方法,要么报错,要么把实现类设置成抽象类
  44. 根据方法覆盖原则:子类方法的访问修饰符必须大于等于父类方法的访问修饰符,接口中的方法都是用public修饰的,所以实现类中的方法只能用public修饰。
  45. 如果是创建实现类对象,此时要面向接口编程,语法: 接口 变量 =new 实现类();
  46. 实现类可以继承父类,也可以同时实现多个接口

PolymorphismDemo2(重点)

需求:我家有一种动物(Animal),你猜它的叫声(shout)是怎么样的,猜不到,因为这个动物有多种形态。

  • 如果该动物是狗(Dog),叫声是:旺旺旺…
  • 如果该动物是猫(Cat),叫声是:妙妙妙…

作业目的:

  • 掌握继承关系多态对象的创建
  • 多态对象调用方法的执行流程
    1. H:\idea-workspace\Day10\src\cn\wolfcode\_04_tyoeconvert
    2. /*总结:继承关系多态的创建 语法: 父类 变量名 = new 子类(); 变量名.方法(); 多态对象调用方法的执行流程
  1. <img src="E:\Users\26423\Desktop\习题\day10-作业\多态对象调用方法的执行流程.png" />
  2. ```java
  3. /* 多态方法的调用:先判断方法是否在父类中,找不到:编译报错;
  4. 找到:再看方法是否在子类中
  5. 1>子类中找不到:运行父类方法
  6. 2>找到了:运行子类方法

PolymorphismDemo3(重点)

需求:定义一个鱼类(Fish)实现会游泳(ISwimable)的接口,创建鱼的多态对象并调用游泳方法

作业目的:

  • 掌握实现关系多态对象的创建
  • 多态对象调用方法的执行流程
  1. package cn.wolfcode._03_poly3;
  2. public class Fish implements ISwimable{
  3. @Override
  4. public void swim() {
  5. System.out.println("青蛙本身就会蛙泳");
  6. }
  7. }
  8. package cn.wolfcode._03_poly3;
  9. public interface IWalkable {
  10. void walk();
  11. }
  12. package cn.wolfcode._03_poly3;
  13. public class PolyDemo1{
  14. public static void main(String[] args){
  15. ISwimable iSwimable = null;
  16. iSwimable =new Fish();
  17. iSwimable.swim();
  18. }
  19. }
  20. /*总结 同上

InstanceofDemo.java

需求:演示类型转换和instanceof关键字的使用

作业目的:

  • 了解引用数据类型的自动转换和强制类型转换
  • 了解instanceof关键字的含义和使用
  1. package cn.wolfcode._04_tyoeconvert;
  2. public class InstanceOfDemo {
  3. public static Dog getAnimal() {
  4. return null;
  5. }
  6. public static void main(String[] args) {
  7. //如果在开发中不知道animal的真实类型
  8. //instance实例的意思
  9. Animal animal = InstanceOfDemo.getAnimal();
  10. //boolean r= animal instanceof Dog;
  11. if (animal instanceof Dog) {
  12. Dog dog = (Dog)animal;
  13. dog.play();
  14. } else if (animal instanceof Cat) {
  15. Cat cat = (Cat)animal;
  16. cat.eat();
  17. }
  18. }
  19. }
  20. //总结instranceof关键字判断该对象是否是某一个类的实例,语法格式:boolean b = 对象A instranceof 类B

USBDemo.java

需求:模拟在主板(MotherBoard)上安装鼠标(Mouse)、键盘(KeyBoard)等,比较没有规范和有规范的区别。

作业目的:理解多态的好处

  1. H:\idea-workspace\Day10\src\cn\wolfcode\_05_usb
  2. H:\idea-workspace\Day10\src\cn\wolfcode\_05_usb2
  3. //总结: 1>有规范 在Mouse和Keyboard类遵循于USB规范——工作的方法名称也相同了;主板类,在安装方法plugin上也体现了多态的特征,面向接口编程,体现的是多态,其好处:把实现类对象赋给接口类型变量,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程 2>无规范情况下,不同设备中的工作方法名称是不一样的,每次需要安装中设备,都需要在主板类新增一个方法

二、综合练习(必做):

1. 练习一 多态

已知生物(Biology)、动物(Animal)、人(Person)三个接口。其中:

  • 生物接口定义呼吸方法(breathe);
  • 动物接口除具备生物接口特征之外,还定义了吃饭(eat)和睡觉(sleep)两个方法;
  • 人接口除具备动物接口特征外,还定义了思维(think)和学习(study)两个抽象方法。
  1. 请使用继承的思想定义上述三个接口 ,
  2. 定义一个学生类(Student)实现上述人接口。
  3. 定义测试类TestDemo ,使用多态的思想在main方法中创建Student的对象 , 调用相应的功能分别实现打印

“我能思考” ; “我能学习” ; “我能睡觉” ; “我能吃饭” ;”我能呼吸”

作业目的:引用数据类型的自动转换和强制类型转换

  1. H:\idea-workspace\Day10\src\_0301\text2_1

2. 练习二 面向对象

某公司旗下有三种型号(model)机器人(Roboot) A 、B、 C。

他们都具有姓名name, 型号model的字段 和 走路功能 walk。 其中:
A 实现了 ISpeak接口中定义的说话功能speak
B实现了ISee接口中的图像识别功能 see,
C 同时实现了说话和识别功能。

请利用继承、接口、多态等知识完成类的设计并编写测试Demo,创建机器人对象, 并调用实现过的方法。

  1. H:\idea-workspace\Day10\src\_0301\text2_2

三、拓展练习 ( 选做 )

1. 拓展一

现有交通工具(Seater),出租车(Taxi),客机(Airliner),客船(Ship)都属于交通工具。

各交通工具都有品牌(brand)字段和载客行为(manned)。

客机实现了IFly接口中定义的飞天的功能fly(),

出租车实现了IRun接口中定义的道路上跑的功能run(),

客船实现了ISwim接口中定义的游的功能swim()。
要求:
1) 用继承和接口,模拟各交通工具和功能的关系,功能用接口。
2) 请在测试类的main方法中用多态的知识,

  1. 调用出租车的run方法,打印“出租车开始跑了”,
  2. 调用飞机的fly方法,打印“飞机开始飞天了”,
  3. 调用客船的swim方法,打印“船舶开始在海洋中漂泊了”,
  4. 调用出租车,客机,客船的载客方法, 分别打印 “我是大众**捷达**出租车,有载客行为”,“我是**波音**飞机,有载客行为”,“我是**泰但尼克号**,有载客行为”。

注:”捷达“, ”波音“,”泰但尼克号“都是各交通工具的品牌

2.拓展二

现有中国电信(ChinaTelecom),中国移动(ChinaMobile),中国联通(ChinaUnicom) 他们都属于网络运营商(NetworkOperator),

都有各自的网络类型(type),比如:

中国电信的网络类型为LTE,中国移动的网络类型为TD-LTE,中国联通的网络类型为WCDMA.

网络运营商都有安装宽带(installBroadband)和安装有线电视(installCableTV)的行为.

网络运营商都实现了上网(IInternet)和打电话(ICall)的功能,

此外,中国移动通过飞信实现了聊天(IChat)的功能.

要求:使用继承知识模拟各网络运营商的关系,使用接口实现功能关系。