Day12 JavaObject02
1… 将人,学生和老师(老师多了教工编号和讲课的行为)案例用继承实现,并添加军人类,军人的特殊属性假设有部队编号,军人特有的行为假设有训练。
package com.cskaoyan.extend.homework.work01;
public class Work01 {
public static void main(String[] args) {
//创建学生对象
Student student = new Student("Tom","man",24,25);
student.print();
student.eat();//调用学生类的父类(人类)的方法
student.study();//调用学生类特有的方法
//创建教师对象
Teacher teacher = new Teacher("Helen","woman",35,10);
teacher.print();
teacher.sleep();//调用教师类的父类(人类)的方法
teacher.teach();//调用教师类特有的方法
//创建军人对象
Soldier soldier = new Soldier("John","man",28,15);
soldier.print();
soldier.eat();//调用军人类的父类(人类)的方法
soldier.training();//调用军人类的父类(人类)的方法
}
}
//人类
class Human{
String name;//姓名
String sex;//性别
int age;//年龄
Human(String name,String sex,int age){//带参构造函数
this.name = name;
this.sex = sex;
this.age = age;
}
public void eat(){//吃饭行为
System.out.println("eating...");
}
public void sleep(){//睡觉行为
System.out.println("sleeping...");
}
public void print(){//输出人的信息
System.out.println("human information---------name:" + name + ",sex:" + sex + ",age:" + age);
}
}
//学生类
class Student extends Human{
int sno;//学号
Student(String name,String sex,int age,int sno){//带参构造函数
super(name,sex,age);
this.sno = sno;
}
public void study(){//学习行为
System.out.println("studying...");
}
public void print(){//输出学生的信息
System.out.println("student information---------name:" + name + ",sex:" + sex + ",age:" + age + ",sno:" + sno);
}
}
//教师类
class Teacher extends Human{
int tno;//教工编号
Teacher(String name,String sex,int age,int tno){//带参构造函数
super(name,sex,age);
this.tno = tno;
}
public void teach(){//讲课行为
System.out.println("teaching...");
}
public void print(){//输出教师的信息
System.out.println("teacher information---------name:" + name + ",sex:" + sex + ",age:" + age + ",tno:" + tno);
}
}
//军人类
class Soldier extends Human{
int ssno;//部队编号
Soldier(String name,String sex,int age,int ssno){//带参构造函数
super(name,sex,age);
this.ssno = ssno;
}
public void training(){//训练行为
System.out.println("training...");
}
public void print(){//输出军人的信息
System.out.println("soldier information---------name:" + name + ",sex:" + sex + ",age:" + age + ",ssno:" + ssno);
}
}
测试
- a. 声明一个Person类,里面定义了三个属性,name、gender、age(姓名、性别、年龄) 通过构造方法进行赋值。有一个display方法,可以展示对应的姓名性别年龄信息 b.
声明一个Student类,继承自Person类,增加一个独特的属性id(学号)
通过构造方法进行赋值,同时有一个方法可以展示姓名性别年龄学号信息 c.
声明一个Teacher类,继承自Person类,增加course属性(教学课程)
通过构造方法进行赋值,有一个方法,可以显示姓名性别年龄教学课程信息 d.编写一个测试类,验证你的代码
package com.cskaoyan.extend.homework;
public class Work02 {
public static void main(String[] args) {
//创建学生对象
Student student = new Student("Tom","man",24,25);
student.display();//输出学生对象的信息
//创建教师对象
Teacher teacher = new Teacher("Helen","woman",35,10);
teacher.display();//输出教师对象的信息
}
}
//人类
class Person{
String name;//姓名
String gender;//性别
int age;//年龄
Person(String name,String gender,int age){//带参构造函数
this.name = name;
this.gender = gender;
this.age = age;
}
public void display(){//输出人的信息
System.out.println("Person Information: " + "name = " + name + ",gender = " + gender + ",age = " + age);
}
}
//学生类
class Student extends Person{
int id;//学号
Student(String name,String gender,int age,int id){//带参构造函数
super(name,gender,age);
this.id = id;
}
public void display(){//输出学生的信息
System.out.println("Student Information: " + "name = " + name + ",gender = " + gender + ",age = " + age + ",id = " + id);
}
}
//教师类
class Teacher extends Person{
int course;//课程号
Teacher(String name,String gender,int age,int course){//带参构造函数
super(name,gender,age);
this.course = course;
}
public void display(){//输出教师信息
System.out.println("Teacher Information: " + "name = " + name + ",gender = " + gender + ",age = " + age + ",course = " + course);
}
}
测试
附加题 分别写出如下两幅图片中所示代码的输出:
1.
分析:
因为Sub类的父类是Base类,所以创建Sub对象触发jvm加载Base类。
首次加载Base类的时候,执行static代码块,输出“base static”。
再加载子类Sub类,
首次加载Sub类时,执行static代码块,输出“sub static”。
到此,类加载结束。
创建Sub类的对象要进行初始化。
初始化父类对象。
首先要执行Base的构造代码块,输出“base构造代码块”。
然后执行Base的构造函数,输出“base构造函数”。
再初始化子类对象。
首先要执行Sub的构造代码块,输出“sub构造代码块”。
然后执行Sub的构造函数,输出“sub构造函数”。
综上,第一幅图中代码的输出为:
base static
sub static
base构造代码块
base构造函数
sub构造代码块
sub构造函数
2.
分析:
执行测试类Obj3的主函数,首先要创建Obj3类的对象,
因为Obj3类的父类是Obj1,所以要先加载Obj1类,再加载Obj3类。
然后进行Obj1对象的初始化,
由于Obj1类的构造函数之前有成员变量的赋值语句:Obj2 obj2 = new Obj2();语句,所以触发jvm加载Obj2类。
再进行Obj2对象的初始化,输出“Obj2”。
再调用Obj1的构造函数,输出“Obj1”。
到此,父类对象初始化完毕。
父类Obj1的对象初始化后再初始化子类Obj3的对象,
由于Obj3类的构造函数之前有成员变量的赋值语句:Obj2 obj2 = new Obj2();
所以再次进行Obj2对象的初始化,输出“Obj2”。
最后执行Obj3的构造函数,输出“obj3”。
综上,第一幅图中代码的输出为:
Obj2
Obj1
Obj2
Obj3