第八章作业
案列01;
1.定义一个Person类{name,age,job},初始化Person对象数组,有3个person对象;
* 并按照age从大到小进行排序,提示,使用冒泡排序Homework01.java
1 package com.homeWork;
2
3 /**
4 * 1.定义一个Person类{name,age,job},初始化Person对象数组,有3个person对象;
5 * 并按照age从大到小进行排序,提示,使用冒泡排序Homework01.java
6 */
7 public class homework01 {
8 public static void main(String[] args) {
9 //定义一个对象数组,里面有三个person对象
10 Person[] people = new Person[3];
11 people[0] = new Person("smith", 36, "java开发工程师");
12 people[1] = new Person("tom", 20, "PHP开发工程师");
13 people[2] = new Person("june", 56, "算法工程师");
14 //输出当前的对象数组
15
16 for (int i = 0; i < people.length; i++) {
17 System.out.println(people[i]);
18 }
19
20 Person temp = null;
21 for (int i = 0; i < people.length - 1; i++) {
22 for (int j = 0; j < people.length - 1 - i; j++) {
23
24 //使用冒泡排序,名字长度从大到小进行排序,也就是前面的名字长度<后面的名字长度,就交换
25 //if (people[j].getName().length() < people[j + 1].getName().length())
26 //使用冒泡排序,age从大到小进行排序,也就是前面的年龄<后面的年龄,就交换
27 if (people[j].getAge() < people[j + 1].getAge()) {
28 temp = people[j];
29 people[j] = people[j + 1];
30 people[j + 1] = temp;
31 }
32 }
33 }
34 System.out.println("排序后的效果如下:");
35 for (int i = 0; i < people.length; i++) {
36 System.out.println(people[i]);
37 }
38
39
40 }
41 }
42
43
44 class Person {
45 private String name;
46 private int age;
47 private String job;
48
49 public Person(String name, int age, String job) {
50 this.name = name;
51 this.age = age;
52 this.job = job;
53 }
54
55 public String getName() {
56 return name;
57 }
58
59 public void setName(String name) {
60 this.name = name;
61 }
62
63 public int getAge() {
64 return age;
65 }
66
67 public void setAge(int age) {
68 this.age = age;
69 }
70
71 public String getJob() {
72 return job;
73 }
74
75 public void setJob(String job) {
76 this.job = job;
77 }
78
79 @Override
80 public String toString() {
81 return "Person{" +
82 "name='" + name + '\'' +
83 ", age=" + age +
84 ", job='" + job + '\'' +
85 '}';
86 }
87 }
案列5.设计父类一员工类。子类:工人类(Worker),农民类(Peasant),教师类(Teacher),科学家类(Scientist),服务生类(Waiter)。
(1)其中工人,农民,服务生只有基本工资sal
(2)教师除基本工资外,还有课酬(元/天)classDay,classSal
(3)科学家除基本工资外,还有年终奖bonus
(4)编写一个测试类,将各种类型的员工的全年工资打印出来
测试:
1 package com.homeWork.homeWork05;
2
3 public class homework05 {
4 public static void main(String[] args) {
5 //工人
6 worker worker = new worker("tom", 6900, 15);
7 System.out.println("工人年工资如下:");
8 worker.printSalary();
9 System.out.println("===================================");
10 //老师
11 Teacher smith = new Teacher("smith", 7600, 14);
12 //对日工资和工作天数进行动态设置
13 smith.setDays(26);
14 smith.setClassSalary(360);
15 System.out.println("老师年工资如下");
16 smith.printSalary();
17 System.out.println("==================================");
18 //科学家
19 Scientist jack = new Scientist("jack", 45000, 16, 330000);
20 System.out.println("科学家年工资如下:");
21 jack.printSalary();
22
23 }
24 }
父类:
1 package com.homeWork.homeWork05; 2 3 /** 4 * 案列5.设计父类一员工类。子类:工人类(Worker),农民类(Peasant),教师类(Teacher),科学家类(Scientist),服务生类(Waiter)。 5 * (1)其中工人,农民,服务生只有基本工资sal 6 * (2)教师除基本工资外,还有课酬(元/天)classDay,classSal 7 * (3)科学家除基本工资外,还有年终奖bonus 8 * (4)编写一个测试类,将各种类型的员工的全年工资打印出来 9 */ 10 public class Employ { 11 12 //定义属性类型 13 private String name; 14 private double sal; 15 private int month; 16 17 //方法(构造器、getter、setter) 18 //构造器 19 20 public Employ(String name, double sal, int month) { 21 this.name = name; 22 this.sal = sal; 23 this.month = month; 24 } 25 26 public String getName() { 27 return name; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 34 public double getSal() { 35 return sal; 36 } 37 38 public void setSal(double sal) { 39 this.sal = sal; 40 } 41 42 public int getMonth() { 43 return month; 44 } 45 46 public void setMonth(int month) { 47 this.month = month; 48 } 49 //方法 50 public void printSalary(){ 51 System.out.println("年工资="+sal*month); 52 } 53 }
子类:
1 package com.homeWork.homeWork05; 2 3 public class Teacher extends Employ { 4 //特有属性 5 private double classSalary;//课时费 6 private int days;//上课天数 7 //方法 8 9 public Teacher(String name, double sal, int month) { 10 //这里的日工资、工作天数不做统一设置,可以通过set进行动态设置 11 super(name, sal, month); 12 } 13 14 public double getClassSalary() { 15 return classSalary; 16 } 17 18 public void setClassSalary(double classSalary) { 19 this.classSalary = classSalary; 20 } 21 22 public int getDays() { 23 return days; 24 } 25 26 public void setDays(int days) { 27 this.days = days; 28 } 29 30 @Override 31 public void printSalary() { 32 System.out.println("年工资="+(getSal()*getMonth()+classSalary*days)); 33 } 34 }
案列4.通过继承实现员工工资核算打印功能
父类:员工类
子类:部门经理类、普通员工类
(1)部门经理工资=1000+单日工资*天数*等级(1.2)。
(2)普通员工工资=单日工资*天数*等级(1.0);
(3)员工属性:姓名,单日工资,工作天数
(4)员工方法(打印工资)
(5)普遍员工及部门经理都是员工子类,需要重写打印工资方法。
(5)定义并初始化普通员工对象,调用打印工资方法输入工资,定义并初始化部门经理对象,调用打印工资方法输入工资
案列3.编写老师类 Homework03.java
(1)要求有属性“姓名name",“年龄age”,“职称post”,"基本工资salary”
(2)编写业务方法,introduce(),实现输出一个教师的信息。
(3)编写教师类的三个子类:教授类(Professor)、副教授类、讲师类。工资级别分别为:教授为1.3、副教授为1.2、讲师类1.1。
在三个子类里面都重写父类的introduce()方法。
(4)定义并初始化一个老师对象,调用业务方法,实现对象基本信息的后台打印.
1 package com.homeWork; 2 3 public class homework03 { 4 public static void main(String[] args) { 5 Teacher teacher = new Teacher("tom",36,"教师",6500); 6 System.out.println(teacher.introduce()); 7 } 8 } 9 /* 10 3.编写老师类 Homework03.java 11 (1)要求有属性“姓名name",“年龄age”,“职称post”,"基本工资salary” 12 (2)编写业务方法,introduce(),实现输出一个教师的信息。 13 (3)编写教师类的三个子类:教授类(Professor)、副教授类、讲师类。工资级别分别为:教授为1.3、副教授为1.2、讲师类1.1。 14 在三个子类里面都重写父类的introduce()方法。 15 (4)定义并初始化一个老师对象,调用业务方法,实现对象基本信息的后台打印. 16 17 */ 18 //创建教师类 19 class Teacher{ 20 private String name; 21 private int age; 22 private String post; 23 private double salary; 24 //创建构造器 25 public Teacher(String name, int age, String post, double salary) { 26 this.name = name; 27 this.age = age; 28 this.post = post; 29 this.salary = salary; 30 } 31 32 public String getName() { 33 return name; 34 } 35 public void setName(String name) { 36 this.name = name; 37 } 38 39 public int getAge() { 40 return age; 41 } 42 public void setAge(int age) { 43 this.age = age; 44 } 45 46 public String getPost() { 47 return post; 48 } 49 public void setPost(String post) { 50 this.post = post; 51 } 52 53 public double getSalary() { 54 return salary; 55 } 56 public void setSalary(double salary) { 57 this.salary = salary; 58 } 59 // 2)编写业务方法,introduce(),实现输出一个教师的信息。 60 public String introduce(){ 61 return "姓名="+name+"\n"+"年龄="+age+"\n"+"职称="+post+"\n"+"月工资="+salary; 62 } 63 } 64 65 //(3)编写教师类的三个子类:教授类(Professor)、副教授类、讲师类。 66 // 工资级别分别为:教授为1.3、副教授为1.2、讲师类1.1。 67 //在三个子类里面都重写父类的introduce()方法。 68 69 class Professor extends Teacher{ 70 private String salaryLevel; 71 72 public Professor(String name, int age, String post, double salary, String salaryLevel) { 73 super(name, age, post, salary); 74 this.salaryLevel = salaryLevel; 75 } 76 77 public String getSalaryLevel() { 78 return salaryLevel; 79 } 80 public void setSalaryLevel(String salaryLevel) { 81 this.salaryLevel = salaryLevel; 82 } 83 84 // public double Level(){ 85 //// if ("教授".equals(getPost())){ 86 //// return 1.3*getSalary(); 87 //// }else if ("副教授".equals(getPost())){ 88 //// return 1.2*getSalary(); 89 //// }else if ("讲师".equals(getPost())){ 90 //// return 1.1*getSalary(); 91 //// }else{} 92 // } 93 @Override 94 public String introduce() { 95 return super.introduce(); 96 } 97 }
案列06;
1 package com.homeWork.homeWork05; 2 3 /** 4 * 6.假定Grand、Father和Son在同一 5 * 个包,问:父类和子类中通过this和 6 * super都可以调用哪些属性和方法 7 */ 8 9 public class homework06 { 10 public static void main(String[] args) { 11 12 } 13 } 14 class Grand{//超类 15 String name="AA"; 16 private int age=100; 17 public void g10(){ 18 19 } 20 } 21 22 class Father extends Grand {//父类 23 String id = "001"; 24 private double score; 25 public void f1(){}; 26 27 } 28 //super可以访问哪些成员(属性和方法)? 29 //super 是用来访问父类的,但是不可以访问父类私有属性 30 // 公共的都可以访问(super.name、super.g10()、) 31 //this可以访问哪些成员? 32 //this是查找本类的属性,所有都可以访问 33 34 35 class Son extends Father{//子类 36 String name="BB"; 37 public void g1(){} 38 private void show(){ 39 } 40 } 41 //super可以访问哪些成员(属性和方法)? 42 //super.id;super.f1(0;super.name;super.g1 43 //this可以访问哪些成员? 44 //this可以访问本类中所有元素
案列07;请写出程序的最终结果
1 package com.homeWork.homework07; 2 //7.写出程序结果 3 public class homework07 { 4 } 5 6 class Test {//父类 7 String name = "Rose"; 8 9 Test() { 10 System.out.println("Test"); 11 } 12 13 Test(String name) { 14 this.name = name; 15 } 16 } 17 18 class Demo extends Test{//子类 19 String name="Jack"; 20 Demo() { 21 super(); 22 System.out.println("Demo"); 23 } 24 Demo(String s){ 25 super(s); 26 } 27 public void test() { 28 System.out.println(super.name); 29 System.out.println(this.name); 30 } 31 public static void main(String[] args) { 32 33 new Demo().test();//匿名对象 34 new Demo("john").test();//匿名 35 } 36 //请输出最终的结果 37 38 }
案列9.设计一个Point类,其x和y坐标可以通过构造器提供。提供一个子类LabeledPoint,其
构造器接受一个标签值和x,y坐标,比如:new LabeledPoint(“Black
Thursday",1929,230.07),写出对应的构造器即可Homework09.java
案列10.编写Doctor类{name,age,job,gender,sal}
相应的getter()和setter()方法,5个参数的构造器,重写父类的equals()方法:public
boolean equals(Object obj),并判断测试类中创建的两个对象是否相等。相等就是判断
属性是否相同
1 package com.unit01;
2
3 /**
4 * 10.编写Doctor类{name,age,job,gender,sal}
5 * 相应的getter()和setter()方法,5个参数的构造器,
6 * 重写父类的equals()方法:public
7 * boolean equals(Object obj),并判断测试类中创建的两个对象是否相等。
8 * 相等就是判断属性是否相同
9 */
10 public class doctor {
11 //属性
12 private String name;
13 private int age;
14 private char gender;
15 private double sal;
16 //构造器
17 public doctor(String name, int age, char gender, double sal) {
18 this.name = name;
19 this.age = age;
20 this.gender = gender;
21 this.sal = sal;
22 }
23
24 public String getName() {
25 return name;
26 }
27
28 public void setName(String name) {
29 this.name = name;
30 }
31 public int getAge() {
32 return age;
33 }
34
35 public void setAge(int age) {
36 this.age = age;
37 }
38 public char getGender() {
39 return gender;
40 }
41
42 public void setGender(char gender) {
43 this.gender = gender;
44 }
45
46 public double getSal() {
47 return sal;
48 }
49 public void setSal(double sal) {
50 this.sal = sal;
51 }
52 //重写父类equals的方法
53 public boolean equals(Object obj){
54 //判断两个对象是否相同
55 if (this==obj){
56 return true;
57 }
58 //判断obj是否是doctor类型或者子类型
59 //过关斩六将
60 if (!(obj instanceof doctor)){//不是的情况
61 return false;
62 }
63 //obj是doctor类型或者子类型:向下转型
64 doctor doctor= (doctor) obj;
65 return this.name.equals(doctor.name)&& this.age==doctor.age && this.gender==doctor.gender&& this.sal==doctor.sal;
66 }
67 }
package com.unit01;
public class homework10 {
public static void main(String[] args) {
doctor doctor1 = new doctor("simth", 26, '男',26500);
doctor doctor2 = new doctor("simth", 26, '男',26500);
System.out.println(doctor1.equals(doctor2));//true;由于已经重写了父类,所以判断的是后的属性是否相同
}
}
案列11;
11.现有Person类,里面有方法run、eat,Student类继承了Person类,并重写了run方
法,自定义了study方法,试写出对象向上转型和向下转型的代码,并写出各自都可以调用
哪些方法,并写出方法输出什么?
class Person{/∥父类
public void run() {System.out.println("person run"); }
public void eat() {System.out.println("person eat"); }
class Student extends Person {//子类
public void run() {System.out.println("student run");}
public void study() {System.out.printIn("student study."); }
}
//向上转型:父类的引用指向子类的对象
Person p= new stustent();
p能调用的是它的编译类型Preson类中的run方法和eat方法
p.run()//最终的运行效果要看它 的运行类型:p的运行类型是stustent()方法:所以输出student run
p.eat()//先去子类student类中查找,没有再去父类中查找:所以输出"person eat"
//向下转型:向下转型:把指向子类对象的父类引用,转成指向子类对象的子类引用
Student s =(Student)p
s能调用的是它的编译类型Student类中的run方法和study方法和父类中的eat()
s.run() 运行结果是student run
s.study()运行结果是student study
s.eat()运行结果是person eat
案例13题目描述:
(1)做一个Student类,Student类有名称(name),性别(sex),年龄
(age),学号(stu id),做合理封装,通过构造器在创建对象时将4个
属性赋值。
(2)写一个Teacher类Teacher类有名称(name),性别(sex),年龄
(age),工龄(work_age),做合理封装,通过构造器在创建对象时将4个
属性赋值。
(3)抽取一个父类Person类,将共同属性和方法放到Person类
(4)学生需要有学习的方法(study),在方法里写生“我承诺,我会好好
学习。”。
(5)教师需要有教学的方法(teach),在方法里写上“我承诺,我会认真
教学。”。
(6)学生和教师都有玩的方法(play),学生玩的是足球,老师玩的是象棋,
此方法是返回字符串的,分别返回“xx爱玩足球”和“xx爱玩象棋”(其
中xx分别代表学生和老师的姓名)。因为玩的方法名称都一样,所以要求
此方法定义在父类中,子类实现重写。
(7)定义多态数组,里面保存2个学生和2个教师,要求按年龄从高到低排序,
(8)定义方法,形参为Person类型,功能:调用学生的study或教师的teach方法
案列13.打印效果如下
老师的信息:
姓名:张飞
年龄:30
性别:男
工龄:5
我承诺,我会认真教课。
张飞爰玩象棋
学生的信息:
姓名:小明
年龄:15
性别:男
学号:00023102
我承诺,我会好好学习。
小明爱玩足球。
Homework13.java
1 package com.homework13;
2 /**
3 * (1)做一个Student类,Student类有名称(name),性别(sex),年龄
4 * (age),学号(stu id),做合理封装,通过构造器在创建对象时将4个
5 * 属性赋值。
6 * (2)写一个Teacher类Teacher类有名称(name),性别(sex),年龄
7 * (age),工龄(work_age),做合理封装,通过构造器在创建对象时将4个
8 * 属性赋值。
9 * (3)抽取一个父类Person类,将共同属性和方法放到Person类
10 * (4)学生需要有学习的方法(study),在方法里写生“我承诺,我会好好
11 * 学习。”。
12 * (5)教师需要有教学的方法(teach),在方法里写上“我承诺,我会认真
13 * 教学。”。
14 * (6)学生和教师都有玩的方法(play),学生玩的是足球,老师玩的是象棋,
15 * 此方法是返回字符串的,分别返回“xx爱玩足球”和“xx爱玩象棋”(其
16 * 中xx分别代表学生和老师的姓名)。因为玩的方法名称都一样,所以要求
17 * 此方法定义在父类中,子类实现重写。
18 * (7)定义多态数组,里面保存2个学生和2个教师,要求按年龄从高到低排序,
19 * (8)定义方法,形参为Person类型,功能:调用学生的study或教师的
20 */
21 //整体测试
22 public class homework13 {
23 public static void main(String[] args) {
24 //测试学生类
25 Student student = new Student("李明", '男', 25, 2016);
26 student.printInfo();//调用学生里面的打印输出方法
27
28 System.out.println("=========================================");
29 Teacher teacher = new Teacher("张飞", '男', 24, 2);
30 teacher.printInfo();
31
32
33 //(7)定义多态数组,里面保存2个学生和2个教师
34 Person[ ] persons = new Person[4];
35 persons[0] = new Student("jack",'男',25,2015);
36 persons[1] = new Student("marry",'女',22,2016);
37 persons[2] = new Teacher("smith",'女',32,5);
38 persons[3] = new Teacher("linda",'男',28,5);
39
40 //创建对象
41 homework13 homework13 = new homework13();
42 homework13.bubbleSort(persons);
43 System.out.println("=======================================");
44 //创建排序后的数组
45 System.out.println("排序后的数组情况");
46 for (int i = 0; i <persons.length ; i++) {
47 System.out.println(persons[i]);
48 }
49 //遍历数组,调用test方法()
50 System.out.println("=================================");
51 for (int i = 0; i < persons.length ; i++) {
52 homework13.test(persons[i]);
53 }
54 }
55
56 //(8)定义方法,形参为Person类型,功能:调用学生的study或教师的teach
57 //分析:这里需要使用到向下转型和类型判断
58 public void test(Person p){
59 if (p instanceof Student){//如果p的运行类型属于学生类型
60 ((Student) p).study();//向下转型
61 }else if (p instanceof Teacher){ //如果p的运行类型属于老师类型
62 ((Teacher) p).teach();
63 }else {
64 System.out.println("do nothing");
65 }
66 }
67
68 //要求按年龄从高到低排序
69 public void bubbleSort(Person[ ] persons){
70 Person temp = null;
71 for (int i = 0; i <persons.length-1 ; i++) {
72 for (int j = 0; j <persons.length-1-i ; j++) {
73 //判断年龄从高到低排序
74 if (persons[j].getAge()<persons[j+1].getAge()){
75 temp = persons[j];
76 persons[j]=persons[j+1];
77 persons[j+1]= temp;
78 }
79 }
80 }
81 }
82
83 }
教师类:
package com.homework13;
/*
(2)写一个Teacher类Teacher类有名称(name),性别(sex),年龄
(age),工龄(work_age),做合理封装,通过构造器在创建对象时将4个
属性赋值。
3)抽取一个父类Person类,将共同属性和方法放到Person类
(5)教师需要有教学的方法(teach),在方法里写上“我承诺,我会认真教学。
*/
public class Teacher extends Person {//教师类
//属性
private int work_age;
//构造器
public Teacher(String name, char sex, int age, int work_age) {
super(name, sex, age);
this.work_age = work_age;
}
//getter和setter方法
public int getWork_age() {
return work_age;
}
public void setWork_age(int work_age) {
this.work_age = work_age;
}
//特有方法
public void teach() {
System.out.println(getName()+"承诺,会搞好教学");
}
//重写父类的play方法
@Override
public String play() {
return super.play()+"踢足球";
}
//输出打印信息,体现封装
public void printInfo(){
System.out.println("信息如下:");
System.out.println(super.basicInfo());
System.out.println("工龄:"+work_age);
teach();
System.out.println(play());
}
@Override
public String toString() {
return "Teacher{" +
"work_age=" + work_age +
'}'+super.toString();
}
}
学生类:
package com.homework13;
/*
案例题目描述:
(1)做一个Student类,Student类有名称(name),性别(sex),年龄
(age),学号(stu id),做合理封装,通过构造器在创建对象时将4个
属性赋值。
3)抽取一个父类Person类,将共同属性和方法放到Person类
(4)学生需要有学习的方法(study),在方法里写生“我承诺,我会好好
* 学习。”。
*/
public class Student extends Person { //学生类
//属性
private int stu_id;
//构造器
public Student(String name, char sex, int age, int stu_id) {
super(name,sex,age);
this.stu_id = stu_id;
}
//方法
public int getStu_id() {
return stu_id;
}
public void setStu_id(int stu_id) {
this.stu_id = stu_id;
}
//学生特有的学习方法
public void study(){
System.out.println(getName()+"承诺,会好好学习");
}
//重写父类的play()方法
@Override
public String play() {
return super.play()+"打篮球";
}
//输出一个打印信息,体现封装
public void printInfo(){
System.out.println("学生信息如下:");
System.out.println(super.basicInfo());//去调用父类的基本信息
System.out.println("学号:"+stu_id);
study();
System.out.println(play());
}
@Override
public String toString() {
return "Student{" +
"stu_id=" + stu_id +
'}'+super.toString();
}
}
父类:
1 package com.homework13;
2 public class Person {//父类
3 private String name;
4 private char sex;
5 private int age;
6
7 public Person(String name, char sex, int age) {
8 this.name = name;
9 this.sex = sex;
10 this.age = age;
11 }
12
13 public String getName() {
14 return name;
15 }
16 public void setName(String name) {
17 this.name = name;
18 }
19
20 public char getSex() {
21 return sex;
22 }
23 public void setSex(char sex) {
24 this.sex = sex;
25 }
26
27 public int getAge() {
28 return age;
29 }
30 public void setAge(int age) {
31 this.age = age;
32 }
33 //方法玩play(),把相同的内容输出
34 public String play(){
35 return name+"兴趣爱好是";
36 }
37 //定义一个基本信息
38 public String basicInfo(){
39 return "姓名:"+name+"\n年龄:"+age+"\n性别:"+sex;
40 }
41
42 @Override
43 public String toString() {
44 return "Person{" +
45 "name='" + name + '\'' +
46 ", sex=" + sex +
47 ", age=" + age +
48 '}';
49 }
50 }
案列14:
案列分析情况:
1.C c = new C() 首先进入的是C类的无参方法。this.("hello"),而this指的是本类中的带参数的方法;所以指向super.("hahah")
2.而super.("hahah")指向的是父类的带参方法B(string name),这里面有个默认的super(),这时候的super(),指的是父类的无参方法A()
输出结果:
我是A类,
hahah我是B类的有参构造
我是c类的有参参构造
我是c类的无参构造
案列15.什么是多态,多态具体体现有哪些?(可举例说明)Homework15.java
多态:方法或对象具有多种形态,是OOP的第三大特征,是建立在封装和继承基础之上
多态具体体现
1.方法多态
(1)重载体现多态(2)重写体现多态
2.对象多态
(1)对象的编译类型和运行类型可以不一致,编译类型在定义时,就确定,不能变化
(2)对象的运行类型是可以变化的,可以通过getClasss()来查看运行类型
(3)编译类型看定时时=号的左边,运行类型看=号右边
3.举例说明