• day11作业------------------Java面向对象--JavaObject02-2


    作业

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

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

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

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

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

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

    代码1:

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         Sub sub = new Sub();
     5 
     6     }
     7 
     8 }
     9 
    10 class Base{
    11     static {
    12         System.out.println("base static");
    13     }
    14     {
    15         System.out.println("base构造代码块");
    16     }
    17     public Base() {
    18         System.out.println("base构造函数");
    19     }
    20 }
    21 class Sub extends Base{
    22     static {
    23         System.out.println("sub static");
    24     }
    25     {
    26         System.out.println("sub构造代码块");
    27     }
    28     public Sub() {
    29         System.out.println("sub构造函数");
    30     }
    31 }

    代码2:

     1 public class Obj3 extends Obj1{
     2     Obj2 obj2 = new Obj2();
     3     public Obj3() {
     4         System.out.println("obj3");
     5     }
     6     public static void main(String[] args) {
     7         //Obj3 obj3 = new Obj3();
     8 
     9     }
    10 
    11 }
    12 
    13 class Obj1{
    14     Obj2 obj2 = new Obj2();
    15     public Obj1() {
    16         System.out.println("obj1");
    17     }
    18 }
    19 class Obj2{
    20     public Obj2() {
    21         System.out.println("obj2");
    22     }
    23 }

    参考答案:

    1.

      1 package com.day011;
      2 /*
      3  * 1. 将人,学生和老师(老师多了教工编号和讲课的行为)案例用继承实现,
      4     并添加军人类,军人的特殊属性假设有部队编号,军人特有的行为假设有训练。
      5  */
      6 public class Demo1 {
      7     public static void main(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 = new Army();
     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 class Human{
     38     String name;
     39     //无参构造方法
     40     public Human() {
     41         //System.out.println("父类的无参构造方法执行了");
     42     }
     43     //带参构造方法
     44     public Human(String name) {
     45         this.name = name;
     46     }
     47 
     48 }
     49 class Student extends Human{
     50     int sno;
     51     
     52     //子类构造方法。初始化问题:要先调用父类构造方法,在子类构造方法
     53     // 首先调用父类构造方法,两种方式:1.子类对象的隐式初始化;2.子类对象的显式初始化
     54      
     55     /* 
     56      * 1.子类对象的隐式初始化
     57      * 条件:1.当父类提供了默认构造方法(无参构造方法);
     58      *        2.且子类的构造方法中没有显式调用父类的其他构造方法
     59      *        3.在执行子类构造方法之前,jvm会自动执行父类的构造方法(无参构造方法)
     60      */
     61     public Student(int sno) {
     62         //System.out.println("子类的构造方法执行了");
     63         this.sno = sno;
     64     }
     65     
     66     //2.子类对象的显示初始化
     67     public Student(String name, int sno) {
     68         //显示调用父类的1参构造方法,把参数值通过super传递给父类构造方法
     69         super(name);
     70         this.sno = sno;
     71     }
     72 
     73 }
     74 class Teacher extends Human{
     75     String num = "老师001";//老师教工编号
     76     public void method() {
     77         System.out.println("father---teacher teaching");
     78     }
     79     public void teacherAccess() {
     80         System.out.println(num);
     81     }
     82     public void teacherAccess1() {
     83         this.method();
     84     }
     85 }
     86 class Army extends Teacher{
     87     String num = "士兵001";//军人部队编号
     88     public void method() {
     89         System.out.println("son---soldier training");
     90     }
     91     public void armyAccess() {
     92         System.out.println(num);
     93     }
     94     //同时访问到,父类,子类中定义的同名成员变量的值
     95     public void allAccess() {
     96         //利用super,访问父类中,定义的同名成员变量值
     97         System.out.println(num + "--" + super.num);
     98     }
     99     public void armyAccess1() {
    100         this.method();
    101     }
    102     public void allAccess1() {
    103         method();
    104         super.method();
    105     }
    106 }

    运行结果:

    2.

     1 package com.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 class Demo2 {
    18 
    19     public static void main(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 class Person{
    29     String name;
    30     String gender;
    31     int age;
    32     public Person(String name, String gender, int age) {
    33         this.name = name;
    34         this.gender = gender;
    35         this.age = age;
    36     }
    37     public void display() {
    38         System.out.println(name + "--" + gender + "--" + age);
    39     }
    40 }
    41 
    42 class Student1 extends Person{
    43     int sno;
    44     public Student1(int sno, String name, String gender, int age) {
    45         super(name, gender, age);
    46         this.sno = sno;
    47     }
    48     public void display() {
    49         System.out.println("学号:" + sno);
    50         super.display();
    51     }
    52     public void stuAccess() {
    53         this.display();
    54     }
    55 }
    56 
    57 class Teacher1 extends Person{
    58     String course;
    59     public Teacher1(String course, String name, String gender, int age) {
    60         super(name, gender, age);
    61         this.course = course;
    62     }
    63     public void display() {
    64         
    65         super.display();
    66         System.out.println("所教课程:" + course);
    67     }
    68 }

    运行结果:

    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对象到此才算初始化完毕

  • 相关阅读:
    detectron源码阅读,avgpool是什么意思、特征意思
    detectron2 特征金字塔代码讲解,detectron2train的过程
    detectron2 一个整体的demo说明自定义数据集以及训练过程
    fcos学习问题
    直接debug在源码上修改的方式
    为什么如果待分类类别是10个,类别范围可以设置成(9,11)
    delphi 各版本下载
    oracle11g 修改字符集 修改为ZHS16GBK
    delphi 判断调试状态
    fastreport5 有变量时 不加引号字符串出错 提示没有声明的变量
  • 原文地址:https://www.cnblogs.com/dust2017/p/12732033.html
Copyright © 2020-2023  润新知