这几天逐渐被idea所折服,越来越喜欢这个优雅又强大的代码编辑器,有很多人说idea对很多初学者不友好,但是在我看来,只要你足够自律,并且英语不会太差,语法上关键的几个单词没什么大问题,idea对初学者是有很大帮助的。因为idea强大的语法检查功能对初学者十分友好,idea提供各种错误提示,以及各个需要注意的地方,这让初学者可以轻松找到出错的代码块。好了,下面来看题目吧!

1.根据以下这段话的描述,用面向对象的思想实现

狗生活在陆地上(是一种陆生动物),既是哺乳类的也是肉食性的。
狗通常的时候和人打招呼会通过“摇摇尾巴”,在被抚摸情绪很好的时候,
会“旺旺叫”,而在受到惊吓情绪烦躁时,会发出“呜呜”声;

猫也生活在陆地上(是一种陆生动物),既是哺乳类的也是肉食性的。
猫通常的时候和人打招呼会发出“喵~”的声音,在被抚摸情绪很好时,
会发出“咕噜咕噜”声,而在受到惊吓时,会发出“嘶嘶”声;

青蛙是一种两栖动物(既是水生动物也是陆生动物),既不是哺乳类的也不是肉食性的,
属于卵生。青蛙通常的时候和人打招呼会通过“呱呱叫”,当青蛙情绪好的时候,
会在岸边“呱呱呱”的唱歌,而在受到惊吓时,会“扑通一声跳入水中”

//下面只实现了狗的模块,猫和青蛙模块同理,不再赘述
//因为水生和陆生不能抽象处出来共性,因此将其定义为接口

package com.company;
abstract class Animal
{static final int HAPPY = 1;static final int UNHAPPY = 0;protected boolean carnivorous;  //肉食protected boolean mammal;  //哺乳public abstract void sayHello();public abstract void sayHello(int mood);public boolean isCarnivorous(){return carnivorous;}public boolean isMammal(){return mammal;}}
//水生动物
interface Water
{boolean hasGillFlag();  //是否有腮
}
//陆生动物
interface Land
{int getLegNumber(); //有多少条腿
}class Dog extends Animal implements Land
{private int dogLegNumber = 4;//访问父类的属性//父类使用权限protectedDog(){this.carnivorous = true;this.mammal = true;}public void sayHello(){System.out.println("摇摇尾巴");}public void sayHello(int mood){switch (mood){case HAPPY:System.out.println("汪汪叫");break;case UNHAPPY:System.out.println("呜呜叫");break;default:System.out.println("摇摇尾巴");}}public int getLegNumber(){return dogLegNumber;}
}public class TaskDay09_4 {public static void main(String[] args){Dog dog = new Dog();if(dog.mammal)System.out.println("狗是哺乳动物");elseSystem.out.println("狗不是哺乳动物");if(dog.carnivorous)System.out.println("狗是肉食动物");elseSystem.out.println("狗不是肉食性动物");System.out.print("狗通常的打招呼方式是:" );dog.sayHello();System.out.print("狗开心的时候的打招呼方式是:" );dog.sayHello(Animal.HAPPY);System.out.print("狗不开心的时候的打招呼方式是:" );dog.sayHello(Animal.UNHAPPY);System.out.println("狗是肉食动物,狗有" + dog.getLegNumber() + "条腿");}
}

总结:这道题因为水生和陆生不能抽象处出来共性,因此需要将其定义为接口

2.已知电脑有三个USB接口,分别去实例化一个鼠标,一个键盘,一个U盘来连接到电脑上。输出每一个USB接口连接的设备信息

package com.company;
interface Usb
{String getDeviceInfo();
}class Mouse implements Usb
{public String getDeviceInfo(){return "鼠标";}
}class KeyBoard implements Usb
{public String getDeviceInfo(){return "键盘";}
}class Upan implements Usb
{public String getDeviceInfo(){return "U盘";}
}class Computer
{private Usb usb1;private Usb usb2;private Usb usb3;public Computer(){}public Computer(Usb usb1, Usb usb2, Usb usb3){this.usb1 = usb1;this.usb2 = usb2;this.usb3 = usb3;}public void showInfo(){System.out.println(usb1.getDeviceInfo());System.out.println(usb2.getDeviceInfo());System.out.println(usb3.getDeviceInfo());}
}public class TaskDay09_1 {public static void main(String[] args){Usb usb1 = new Mouse();Usb usb2 = new KeyBoard();Usb usb3 = new Upan();Computer com = new Computer(usb1, usb2, usb3);com.showInfo();}
}

总结:在做这道题的时候面向对象的思想不明确,导致题意不懂。
只需要将USB定义为接口,接口的作用是用来展示键盘、鼠标、U盘各个设备的信息。键盘、鼠标、U盘只需要分别定义为一个类实现接口即可。将电脑定义为一个类,其中包含了三个USB对象,并通过方法试实现展示功能。
注意:接口是抽象的,不能用来实例化对象,只能通过实现接口的各个类和实例化对象。因此在main函数中利用多态来实现函数功能。

3.设计一个交通工具抽象类,提供抽象方法–驾驶

汽车作为交通工具的一种,实现了驾驶的方法(在马路上驾驶)
火车作为交通工具的一种,实现了驾驶的方法(在铁路上驾驶)
飞机作为交通工具的一种,实现了驾驶的方法(在天上驾驶)
需求:做一个测试类,在测试类的main函数中,分别实例化一个汽车的对象,火车的对象和飞机的对象,并分别描述驾驶行为

package com.company;abstract class Transportation
{abstract void Drive();
}class Car extends Transportation
{public void Drive(){System.out.println("马路上行驶");}
}class Train extends Transportation
{public void Drive(){System.out.println("铁路上行驶");}
}class Plane extends Transportation
{public void Drive(){System.out.println("天上行驶");}
}public class TaskDay09_2
{public static void main(String[] args){Car car = new Car();Train train = new Train();Plane plane = new Plane();func(car);func(train);func(plane);}//多态:父类的引用指向了子类public static void func(Transportation tool){tool.Drive();}
}

总结:同样的,这题也是通过多态实现,但是这题是抽象类,但是第2题是接口。
多态的过程细节:多态与继承、方法重写密切相关,我们在方法中接收父类类型作为参数,在方法实现中调用父类类型的各种方法。当把子类作为参数传递给这个方法时,java虚拟机会根据实际创建的对象类型,调用子类中相应的方法(存在方法重写时)。
因此可以继续总结多态实现的三个条件,一定要记下来!
1.需要有继承关系(普通子父类的继承和抽象类的继承)或者实现(接口)的存在。
2.需要有方法的重写。
3.需要有父类的引用指向子类对象。

4.设计一个家政服务规范(接口): 洗衣服, 扫地, 买菜, 做饭

设计一个保姆类, 保姆需要遵循这些规范
需求:在测试类中,实例化一个保姆的对象,然后让保姆买菜,做饭,扫地

package com.company;interface Service
{void wishClothes();void sweepFloor();void cookRice();
}class Nurse implements Service
{private String name;Nurse(){}Nurse(String name){this.name = name;}public String getName(){return name;}public void wishClothes(){System.out.println("wishClothes");}public void sweepFloor(){System.out.println("sweepFloor");}public void cookRice(){System.out.println("cookRice");}
}public class TaskDay09_3
{public static void main(String[] args){Nurse nurse = new Nurse("Tom");System.out.println(nurse.getName());show(nurse);}public static void show(Service ser){ser.wishClothes();ser.sweepFloor();ser.cookRice();}
}

这一题同样是用到了多态,和上面两道题不一样的是,这一题里面的子类包含了自己特有的属性,因此先先定义了一个子类对象nurse,利用子类对象nurse对其属性先赋初始值。之后利用多态,创建ser(接口)对象,再将ser对象指向子类对象nurse,实例化的同样只是子类,而不是接口。
经过这三道题目的踪总结,对于多态应当有了更深入的理解。

5.设计一个动物类,属性: 姓名,性别

设计一个猫类,设计一个狗类, 猫和狗都继承自动物类
需求:在测试类中设计一个方法,这个方法需要一个参数,参数的类型可以是猫类,也可以是狗类 -->多态(动物类 )

package com.company;abstract class Animals
{private String name;private String sex;Animals(){}Animals(String name, String sex){this.name = name;this.sex = sex;}public void setName(String name){this.name = name;}public void setSex(String sex){this.sex = sex;}public String getName(){return name;}public String getSex(){return sex;}
}class Cat extends Animals
{Cat(){}Cat(String name, String sex){super(name, sex);}
}class Dog1 extends Animals
{Dog1(){}Dog1(String name, String sex){super(name, sex);}
}class TaskDay09_4
{public static void main(String[] args){Cat cat = new Cat("Tom","M");Dog1 dog1= new Dog1("Amy", "W");testAnimals(cat);testAnimals(dog1);}public static void testAnimals(Animals ani){if (ani instanceof Cat){//下面这段可以进行封装,但是懒。。。String name = ani.getName();String sex = ani.getSex();System.out.println(name);System.out.println(sex);}if (ani instanceof Dog1){String name = ani.getName();String sex = ani.getSex();System.out.println(name);System.out.println(sex);}}
}

总结:认真做到这一道题目的时候已经对面向对象、抽象类、多态有比较深入的理解了!
1.抽象类也是一个类,也应当包含构造方法。
2.子类在继承抽象类时,构造方法应当重写,并继承父类的构造器。
3.为了更加细致地体现面向对象的思想,在main方法中定义的对象应当有明确的指向,例如Cat cat = new Cat(“Tom”,“M”); 此处定义的对象cat应当指向Cat类,而不是指向的Animals类,同时利用构造器对该对象赋初始值更加方便快捷
4.细节上来说,每次重写构造器时都应当写上该类的默认构造器,若不写上,则利用该类作为父类定义子类时,子类找不到父类的默认构造方法出现意想不到的错误。坚持一个良好习惯就成功了一半!

6.设计一个数据传输接口:Type-C标准

设计一个防水的接口:防水
设计一个手机类,实现这个数据传输接口,采用Type-C;同时实现了防水的接口

package com.company;interface TypeC
{}
interface waterProof
{}
class Phone implements TypeC,waterProof
{}
public class TaskDay09_5
{public static void main(String[] args){Phone phone = new Phone();}
}

总结:实现多个接口

7.模拟 Arrays.sort 方法,实现如下方法,实现对一个Person数组的排序,给第二个参数传递对象时使用匿名内部类。

  MyArrays.sort(Person[] array, MyComparator comparator);Person是一个类,MyComparator是一个比较器,包含了compare抽象函数,需要使用匿名内部类重写
package com.company;interface MyComparator
{int compare(Person ren1, Person ren2);}class Person
{private String name;private int age;public Person(){}public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}//重写toString方法public String toString(){return name+"," +age;}
}public class TaskDay09_6 {public static void main(String[] args){Person[] arr = {new Person("lisi", 20), new Person("zhosi", 35),new Person("wangzi", 18), new Person("gangzi", 40), };sort(arr, new MyComparator(){public int compare(Person ren1, Person ren2){return ren1.getAge() - ren2.getAge();}});for (Person person:arr){System.out.println(person.toString());}}//选择排序,排序器用来比较大小的,只有这么一个功能public static void sort(Person[] array, MyComparator comparator){for (int i=0; i<array.length-1; i++){for(int j=i+1; j<array.length; j++){if(comparator.compare(array[j], array[i])>0){Person temp = array[j];array[j] = array[i];array[i] = temp;}}}}
}

按照题目要求做即可,这里对Person排序指的是对Person里的age排序。
比较震撼的是lambda表达式,idea直接可以将匿名内部类换成lambda表达式,期待后面的学习

【Java语言基础】面向对象之封装、继承、抽象类、接口、多态综合知识习题及总结day11相关推荐

  1. 【小白学java】java的面向对象设计:封装+继承+抽象类+接口(day06)

    课程链接:共六天 第一天:开发环境:初识java,搭建环境 第二天:语言基础:关键字.变量.常量.运算符 第三天:数据结构:基本类型.包装类型.引用类型(数组和对象) 第四天:流程控制:分支判断.循环 ...

  2. Java语言基础-面向对象编程三步走之打开冰箱门

    开头: 何谓"面向对象" 面向对象是一种编程思想. 思想是一个很虚无缥缈的东西,但是它可以从一个人的具体行动中体现出来,如果说你坚持每天跑步,每天读书,做一些有益于身心健康的事情, ...

  3. 黑马程序员——java语言基础——面向对象

    ---------------------- android培训.java培训.期待与您交流! ---------------------- 类就是:对现实生活中事物的描述. 对象:就是这类事物,实实 ...

  4. JAVA语言基础-面向对象(IO:IO字符流、递归)

    2019独角兽企业重金招聘Python工程师标准>>> 21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先 ...

  5. JAVA语言基础-面向对象(集合框架02List、泛型)

    2019独角兽企业重金招聘Python工程师标准>>> 16.01_集合框架(去除ArrayList中重复字符串元素方式)(掌握) A:案例演示 需求:ArrayList去除集合中字 ...

  6. java语言基础-面向对象编程-方法(廖雪峰老师官网学习记录)

    Java是一种面向对象的编程语言. 面向对象编程,英文是Object-Oriented Programming,简称OOP. 面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方 ...

  7. 【java后端学习】java语言基础(夯实基础)

    文章目录 一.基础语法 1 java中的标识符 1.1 变量命名规范 1.2 保留字 2 java中的常量 3 java基本数据类型 4 数组 5 字符及字符串 6 运算符 7 控制语句 for语句 ...

  8. 1,Java语言基础-Java语言概述和必要计算机知识

    Java语言基础 Java语言概述 1,Java语言发展史 Java语言本质 Java是面向对象的高级语言,它是由c和c++发展而来. Java发展语言历史概述 Java 是由 James Gosli ...

  9. Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)

    原文:Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制) 异常机制和File类 异常机制 基本概念 异常就是"不正常"的含义,在 Java 语言中主要指 ...

最新文章

  1. 个人理财助手2009 V2.4
  2. ashly理器4.8软件汉化版_AMD 处理器核心比英特尔多还更便宜?英特尔回应
  3. 信息学奥赛C++语言:约瑟夫问题
  4. C#LeetCode刷题-脑筋急转弯
  5. (18)System Verilog禁止约束语句
  6. IIS 7.5 下PHP(FastCGI模式)配置手记
  7. 报名截止仅剩5天!50万冠军大奖,错过再等一年!
  8. Codeforces 439E Devu and Birthday Celebration 容斥
  9. 27.yii2 商城
  10. WEB系统技术开发方向
  11. MySQL数据库所有知识点最详细讲解,内置官方文档、个人理解、代码演示,自学MySQL必备文档(一)
  12. 软件工程之软件工程管理
  13. 原生js页面滚动顶部显示滚动总进度条效果
  14. 微信小程序自制底部菜单栏
  15. java本地外地号码,将JavaAnpr本地化为本地牌照
  16. Spring session redis ERR unknown command 'CONFIG'
  17. 爬虫之使用正则提取数据
  18. ​FH5202原厂2A开关式同步降压型锂电池充电电路IC
  19. 【将进酒 (李白)】
  20. OpenGL ES —— PBO 使用

热门文章

  1. epic转移游戏_Google对Epic的回应 Android 12将使安装应用商店更加容易
  2. 思维导图学习法——记忆曲线
  3. GNN推荐算法(二)—Multi-GCCF:物尽其用
  4. javas文档对象模型(DOM)
  5. 清新淡雅个人简历PPT模板
  6. 「网络流 24 题」圆桌聚餐
  7. Unity3D占用内存太大怎么解决
  8. 医院业务系统设计(二) --- 患者管理之MPI系统
  9. AutoCAD常见问题及解决
  10. axure element ui素材_【Axure分享】基于Element UI的Axure Web组件