1.学习使用思惟导图对Java面向对象编程的知识点(封装、继承和多态)进行总结
java
2.阅读下面程序,分析是否能编译经过?若是不能,说明缘由。应该如何修改?程序的运行结果是什么?为何子类的构造方法在运行以前,必须调用父 类的构造方法?能不能反过来?git
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { System.out.println("Parent Created"); super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class Test{ public static void main(String args[]) { Child c = new Child(); } }
不能经过编译会提示错误:构造函数调用必须是构造函数中的第一个语句
将算法
class Parent extends Grandparent { public Parent() { super("Hello.Grandparent."); System.out.println("Parent Created"); } }
改后运行结果为编程
GrandParent Created.String:Hello.Grandparent. Parent Created Child Created
子类对象在实例化前必须调用父类中的方法再调用子类本身的造方法,调用父类中的构造方法,就是用父类的构造方法为父类中的属性初始化,意思就是先有类实例,才能产生子类实例,不能调过来,应由于子类对象的实例化过程与生活很相似,孩子不可能凭空“蹦”出来,确定是先有父母再有孩子,因此不能调过来。
3 . 阅读下面程序,分析程序中存在哪些错误,说明缘由,应如何改正?正确程序的运行结果是什么?
改后的程序为:数组
class Animal{ void shout(){ System.out.println("动物叫!"); } public void sleep() { // TODO 自动生成的方法存根 } } class Dog extends Animal{ public void shout(){ System.out.println("汪汪......!"); } public void sleep() { System.out.println("狗狗睡觉......"); } } public class Test2 { public static void main(String args[]) { Animal animal = new Dog(); animal.shout(); animal.sleep(); Dog dog = (Dog) animal; dog.sleep(); Animal animal2 = new Animal(); dog = (Dog)animal2; dog.shout(); } }
程序中的问题及缘由:
没有为类型 Animal 定义方法 sleep()
类型不匹配:不能从 Animal 转换为 Dog
正确程序运行的结果为:eclipse
汪汪......! 狗狗睡觉...... 狗狗睡觉......
4.运行下列程序
(1)程序的运行结果以下,说明什么问题?函数
做业练习.Person@4b61fc 做业练习.Person@4b61fc
说明调用出错,程序只是随机输出了一些地址信息,对象输出时必定会调用Object类中的toString方法打印内容,凭此特性能够经过toString()取得一些对象信息。
(2)那么,程序的运行结果究竟是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,可否解释本例的运行结果?
程序运行结果只是随机输出了一些地址信息,该方法中调用了toString()方法;
(3)在Person类中增长以下方法工具
public String toString(){ return "姓名:" + this.name + ",年龄:" + this.age ; }
从新运行程序,程序的执行结果是什么?说明什么问题?
可参考教材P229学习
姓名:张三,年龄:20
说明程序的Person类中赋写了Object类中的toString方法,这样直接输出对象时调用的是被子类赋写过的toString方法。
5.其余须要总结的内容。
我把一些我认为重要的零散的知识点总结了一下
Integer在Java中属于包装类,对于Integer可使用MAX_VALUE取得其最大值,也能够经过MIN_VALUE取得其最小值,Intager的最大做用在于字符串与整型的转换上,还具备自动拆箱和装箱的功能;
布尔类型 boolean flag=ture;声明布尔变量flag,并赋值为true;
经过三目运算符求最大值:max=x>y?x:y;
用while和do...while循环操做时不必定明确知道循环次数;若明确知道循环次数能够用for循环;
递归调用时必须有一个明确的结束条件,而后不断改变传入的数据,才能够实现递归调用;
使用Java提供的排序操做:java.util.Arrays.sort(数组名);
对象使用前必须实例化;
只要被封装的属性,必须经过setter和getter方法设置和取得;
每一个构造方法的参数类型或参数个数不一样构造方法可实现重载;
判断两个字符串相等的方法:利用String类中的equals();
字符串的内容不能够改变;
使用String的replaceAll方法能够将字符串的指定内容进行替换;
无参构造方法中最好不要调用其它构造方法;测试
1.1.定义员工类,具备姓名、年龄、性别属性,并具备构造方法和显示数据方法。定义管理层类,继承员工类,有本身的属性职务和年薪。定义职员类,继承员工类,并有本身的属性所属部门和月薪。定义一个测试类,进行测试。画出类图。
工具:ProcessOn
参考资料:UML 类图
2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)创建测试类,进行测试。画出类图。
public double getBallv(){ ballv=1.33*PI*r*r*r; return ballv; }
输出结果有多位小数
球的体积为112.75740000000002球的表面积为:113.039 解决方法:用Java中的String.format(%.2f)保留两位小数。
类图为:
3.. 参考类图,重构下面的实例,分析和理解多态的含义和用途
(1)某动物园有一饲养员小李,天天须要给他所负责饲养的一只狮子、五只猴子和十只鸽子喂食。 请用一个程序来模拟他喂食的过程。分析这种编程方式有什么不合理的地方。
程序中重复的代码不少,能够优化程序.建立动物类,
(2)第一次重构,引入继承,利用抽象类和对象多态重构程序,Animal类采用抽象类, 合并Feeder类中的方法分析程序是否还能够进一步优化
程序能够优化在抽象类中我定义了动物的属性和方法,子类中覆写了抽象类中的方法.在测试类中实例化子类的对象.
(3)第二次重构,修改feedAnimals方法,让它接收一个Animal数组经过本题的重构,说一下多态有什么好处。在第二次重构以后,是否就能应对各类场景了呢?你认为还应该作哪些优化?
数组是个人弱处,在数组的定义处就遇到了问题,传参时数组传递出错,所以第三个程序没有改完.
多态的好处:提升了代码的扩展性;
提升了代码的维护性;
优化:若是喂养了多只某种动物每次不只要建立对象还得写多个调用方法,而调用方法仅仅是对象名不同;