java建老师类学生类_day11作业------------------Java面向对象--JavaObject02-2

这篇博客介绍了如何使用Java实现人、学生、老师和军人类的继承关系,包括各自特有属性和行为。通过创建测试类验证了代码,并给出了两个代码段的执行结果分析,涉及构造方法、静态代码块和对象初始化的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作业

1. 将人,学生和老师(老师多了教工编号和讲课的行为)案例用继承实现,

并添加军人类,军人的特殊属性假设有部队编号,军人特有的行为假设有训练。

2.

a. 声明一个Person类,里面定义了三个属性,name、gender、age(姓名、性别、年龄)

通过构造方法进行赋值。有一个display方法,可以展示对应的姓名性别年龄信息

b. 声明一个Student类,继承自Person类,增加一个独特的属性id(学号)

通过构造方法进行赋值,同时有一个方法可以展示姓名性别年龄学号信息

c. 声明一个Teacher类,继承自Person类,增加course属性(教学课程)

通过构造方法进行赋值,有一个方法,可以显示姓名性别年龄教学课程信息

d.编写一个测试类,验证你的代码.(分别创建Student对象,和Teacher对象,

要求利用子类对象的显示初始化,即在子类构造方法中,调用父类构造方法的方式

来初始化子类对象。)

附加题

分别写出如下两个代码中所示代码的输出

代码1:

1 public classTest {2

3 public static voidmain(String[] args) {4 Sub sub = new Sub();

5

6 }7

8 }9

10 classBase{11 static{12 System.out.println("base static");13 }14 {15 System.out.println("base构造代码块");16 }17 publicBase() {18 System.out.println("base构造函数");19 }20 }21 class Sub extendsBase{22 static{23 System.out.println("sub static");24 }25 {26 System.out.println("sub构造代码块");27 }28 publicSub() {29 System.out.println("sub构造函数");30 }31 }

代码2:

1 public class Obj3 extendsObj1{2 Obj2 obj2 = newObj2();3 publicObj3() {4 System.out.println("obj3");5 }6 public static voidmain(String[] args) {7 //Obj3 obj3 = new Obj3();

8

9 }10

11 }12

13 classObj1{14 Obj2 obj2 = newObj2();15 publicObj1() {16 System.out.println("obj1");17 }18 }19 classObj2{20 publicObj2() {21 System.out.println("obj2");22 }23 }

参考答案:

1.

7459d012316a6d6e2d3d11d6ffca2387.png

1 packagecom.day011;2 /*

3 * 1. 将人,学生和老师(老师多了教工编号和讲课的行为)案例用继承实现,4 并添加军人类,军人的特殊属性假设有部队编号,军人特有的行为假设有训练。5 */

6 public classDemo1 {7 public static voidmain(String[] args) {8 //创建子类对象

9 System.out.println("------子类对象的隐式初始化------");10 Student stu1 = new Student(1);11 stu1.name = "学生赵1";12 System.out.println(stu1.name+"--"+stu1.sno);13

14 System.out.println("------子类对象的显式初始化------");15 Student stu2 = new Student("学生赵2",2);16 System.out.println(stu2.name+"--"+stu2.sno);17

18 System.out.println("-------父类域的隐藏-------");19 //调用子类的方法,在子类方法的方法体中,访问同名成员变量

20 Army army = newArmy();21 army.armyAccess();22 //在子类对象上,调用父类方法,在父类方法的方法体中,访问同名成员变量

23 army.teacherAccess();24 //在子类中,实现同时访问,父类,子类中的同名成员变量的值

25 army.allAccess();26

27 System.out.println("------方法覆盖------");28 //在子类方法体中,调用父类、子类一模一样的成员方法

29 army.armyAccess1();30 //在父类方法体中,调用父类、子类一模一样的成员方法

31 army.teacherAccess1();32 //在子类类体中,同时访问子类和父类中定义的一模一样的方法

33 army.allAccess1();34 }35 }36

37 classHuman{38 String name;39 //无参构造方法

40 publicHuman() {41 //System.out.println("父类的无参构造方法执行了");

42 }43 //带参构造方法

44 publicHuman(String name) {45 this.name =name;46 }47

48 }49 class Student extendsHuman{50 intsno;51

52 //子类构造方法。初始化问题:要先调用父类构造方法,在子类构造方法53 //首先调用父类构造方法,两种方式:1.子类对象的隐式初始化;2.子类对象的显式初始化

54

55 /*

56 * 1.子类对象的隐式初始化57 * 条件:1.当父类提供了默认构造方法(无参构造方法);58 * 2.且子类的构造方法中没有显式调用父类的其他构造方法59 * 3.在执行子类构造方法之前,jvm会自动执行父类的构造方法(无参构造方法)60 */

61 public Student(intsno) {62 //System.out.println("子类的构造方法执行了");

63 this.sno =sno;64 }65

66 //2.子类对象的显示初始化

67 public Student(String name, intsno) {68 //显示调用父类的1参构造方法,把参数值通过super传递给父类构造方法

69 super(name);70 this.sno =sno;71 }72

73 }74 class Teacher extendsHuman{75 String num = "老师001";//老师教工编号

76 public voidmethod() {77 System.out.println("father---teacher teaching");78 }79 public voidteacherAccess() {80 System.out.println(num);81 }82 public voidteacherAccess1() {83 this.method();84 }85 }86 class Army extendsTeacher{87 String num = "士兵001";//军人部队编号

88 public voidmethod() {89 System.out.println("son---soldier training");90 }91 public voidarmyAccess() {92 System.out.println(num);93 }94 //同时访问到,父类,子类中定义的同名成员变量的值

95 public voidallAccess() {96 //利用super,访问父类中,定义的同名成员变量值

97 System.out.println(num + "--" + super.num);98 }99 public voidarmyAccess1() {100 this.method();101 }102 public voidallAccess1() {103 method();104 super.method();105 }106 }

运行结果:

d6c528016fbf6dabd1ff923ae7b67212.png

2.

0707014302b2e4d5323b0c9fef53b4b9.png

1 packagecom.day011;2 /*

3 * 2.4 a. 声明一个Person类,里面定义了三个属性,name、gender、age(姓名、性别、年龄)5 通过构造方法进行赋值。有一个display方法,可以展示对应的姓名性别年龄信息6

7 b. 声明一个Student类,继承自Person类,增加一个独特的属性id(学号)8 通过构造方法进行赋值,同时有一个方法可以展示姓名性别年龄学号信息9

10 c. 声明一个Teacher类,继承自Person类,增加course属性(教学课程)11 通过构造方法进行赋值,有一个方法,可以显示姓名性别年龄教学课程信息12

13 d.编写一个测试类,验证你的代码.(分别创建Student对象,和Teacher对象,14 要求利用子类对象的显示初始化,即在子类构造方法中,调用父类构造方法的方式15 来初始化子类对象。)16 */

17 public classDemo2 {18

19 public static voidmain(String[] args) {20 Student1 stu = new Student1(1,"孙悟空","男",18);21 stu.display();22 System.out.println();23 Teacher1 tea = new Teacher1("Java","张三","男",26);24 tea.display();25 }26

27 }28 classPerson{29 String name;30 String gender;31 intage;32 public Person(String name, String gender, intage) {33 this.name =name;34 this.gender =gender;35 this.age =age;36 }37 public voiddisplay() {38 System.out.println(name + "--" + gender + "--" +age);39 }40 }41

42 class Student1 extendsPerson{43 intsno;44 public Student1(int sno, String name, String gender, intage) {45 super(name, gender, age);46 this.sno =sno;47 }48 public voiddisplay() {49 System.out.println("学号:" +sno);50 super.display();51 }52 public voidstuAccess() {53 this.display();54 }55 }56

57 class Teacher1 extendsPerson{58 String course;59 public Teacher1(String course, String name, String gender, intage) {60 super(name, gender, age);61 this.course =course;62 }63 public voiddisplay() {64

65 super.display();66 System.out.println("所教课程:" +course);67 }68 }

运行结果:

8710fc0d4cf30a9fb0d3b08a2fa63aa6.png

3.

附加题:

第一幅图片

1. 创建子类对象之前,首先执行类加载过程

先加载父类,于是父类中的静态代码块的代码先执行

2. 父类加载完毕后,开始加载子类,于是子类静态代码块代码后执行

3. 类加载过程完毕后,首先初始化父类对象,所以首先执行父类中的构造代码块,在执行父类中的构造方法

4. 然后在初始化子类成员,执行子类的构造代码块,子类的构造方法

第二幅图片

1. 程序从 Obj3 obj3 = new Obj3();开始执行

因为Obj3有父类Obj1,所以初始化子类对象之前,先初始化父类对象

先执行,执行Obj1类中,成员变量赋值的语句

Obj2 obj2 = new Obj2();

2. 于是创建 Obj2类的对象,执行Obj2类的构造方法

3. 对Obj3的父类(Obj1)对象的初始化还没完,执行完了Obj1类中的Obj2 obj2 = new Obj2()之后,因为Obj3的父类Obj1的构造方法还没执行完,紧接着执行Obj1类的构造方法,到此为止,Obj3的父类对象才初始化完

4. 接近着才轮到Obj3对象初始化,首先先执行Obj3的成员变量的赋值语句

Obj2 obj2 = new Obj2();执行Obj2的构造方法

紧接着,执行Obj3的构造方法,Obj3对象到此才算初始化完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值