Java第四次作业—面向对象高级特性(继承和多态)
Java第四次作业—面向对象高级特性(继承和多态)
(一)学习总结
1.学习使用思维导图对Java面向对象编程的知识点(封装、继承和多态)进行总结。
2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?
不能够编译通过,使用super关键字调用父类的构造方法需要将语句supe("Hello.Grandparent.");放在第一句。
构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态,构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用,因为父类不知道子类有什么变量而且子类也得不到初始化的父类变量。
3 . 阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?
class Animal{
void shout(){
System.out.println("动物叫!");
}
}
class Dog extends Animal{
public void shout(){
System.out.println("汪汪......!");
}
public void sleep() {
System.out.println("狗狗睡觉......");
}
}
public class Test{
public static void main(String args[]) {
Animal animal = new Dog();
animal.shout();
//创建对象,向上转型。父类中没有sleep方法,所以不能够被调用。
Dog dog =(Dog)animal;
//向下转型,应强制类型转换
dog.sleep();
Animal animal2 = new Dog();
dog = (Dog)animal2;
//父类与子类没有建立联系,父类不能向子类转换
dog.shout();
}
}
4.运行下列程序
程序修改:
class Person {
private String name ;
private int age ;
public Person(){
}
public Person(String name,int age){
this.name = name ;
this.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 String toString(){
return "姓名"+getName()+" 年龄"+getAge();
}
}
public class Test{
public static void main(String args[]){
Person per = new Person("张三",20) ;
System.out.println(per);
System.out.println(per.toString()) ;
}
}
(1)对象输出时一定会调用Object类中的toString()方法打印内容。java所有类都有一个公共的父类Object,toString方法是Object中的常用方法,子类中不覆写toStrong方法时,调用toString程序会随机给出地址信息
(2)程序中覆写了toString方法,输出对象信息时调用的是子类中覆写的toString方法
5.其他需要总结的内容。
(1)多态:对象的向上转型:转型之后,操作的为父类对象,则无法找到子类中定义的新方法 对象的向下转型:如果想要产生一个对象向下转型则必须产生向上转型关系,表示子类与父类关系的建立
(2)抽象类:抽象类必须有子类,不能使用final关键字声明,可以有构造方法
(3)继承:子类无条件继承父类的无参构造方法 子类可通过super关键字调用父类的构造方法
(4)final关键字:final关键字不能有子类 final声明的方法不能被子类继承 使用final声明的方法不能被子类覆写,使用final声明的变量即为常量,需为其指定内容,static final联合声明的为全局常量
(二)实验总结
1.
程序设计思路:
(1)定义员工类,具有姓名、年龄、性别属性,构建构造方法和get,set方法。
(2)定义管理层类,继承员工类,写出子类属性职务和年薪,使用super关键字继承父类属性。
(3)定义职员类,继承员工类,写出子类属性所属部门和月薪,使用super关键字继承父类属性。
(4)定义一个测试类,进行测试
类图:
2.
程序设计思路:
(1)构建一个平面图形抽象类,写出Zhou1,Mian1方法用来求周长和面积。构建一个立体图形抽象类,写出Zhou2,Mian2方法用来求表面积和体积。
(2)构建球类、圆柱类,圆锥类继承立体图形抽象类,覆写父类中的zhou1,Mian1方法。构建矩形类、三角形类、圆类继承平面图形抽象类,覆写父类中的zhou2,Mian2方法。
(3)建立测试类,进行测试
类图:
3.
程序设计思路:
(1)构造狮子类,猴子类,鸽子类,喂养类
(2)在喂养类中构建狮子,猴子,鸽子的对象,并调用eat()方法。
(3)写出测试类,进行测试
程序设计思路:
(1)构建抽象类Animal
(2)构建狮子类,猴子类,鸽子类继承父类Animal类,覆写父类中eat()方法。
(3)在喂养类中创建Animal的对象an,调用eat()方法。
(4)创建测试类,创建子类向上转型父类,调用父类中eat()方法。
程序设计思路:
(1)构建抽象类Animal
(2)构建狮子类,猴子类,鸽子类继承父类Animal类,覆写父类中eat()方法。
(3)在喂养类中创建Animal的对象数组animal[],调用eat()方法。
(4)创建测试类,在对象数组中添加对象并输出。