Bootstrap

实验4:Java 中的类继承机制

实验名称:实验4:Java 中的类继承机制

一、实验目的

熟悉Java 中的类继承机制,体会继承的好处:重用和封装。

二、实验内容与结果

(说明:按实验任务分别填写任务描述、处理思路及关键技术说明、程序源码和运行结果截图,不要心得与体会。)

任务1声明一个Person类,有name(String类型)、age(int类型)、sex(char类型)属性。通过构造方法进行赋值。一个show方法,返回String类型,内容如下:某某 男(女) 年龄

处理思路

如题,在主类中用构造方法进行赋值,调用对应show方法输出对应值

关键技术说明

返回String型数值可以return name+" "+sex+" "+age;

程序源码

package q1;

public class test {
    public static void main(String args[]){
        Person a =new Person("
小红",18,'');
        Person b =new Person("
小明",19,'');
        Person c =new Person("
小黑",17,'');
        System.out.print(a.show());
        System.out.print('\n');
        System.out.print(b.show());
        System.out.print('\n');
        System.out.print(c.show());
    }
}

package q1;

public class test {
    public static void main(String args[]){
        Person a =new Person("
小红",18,'');
        Person b =new Person("
小明",19,'');
        Person c =new Person("
小黑",17,'');
        System.out.print(a.show());
        System.out.print('\n');
        System.out.print(b.show());
        System.out.print('\n');
        System.out.print(c.show());
    }
}

package q1;

public class Person {
    public String name;
    public int age;
    public char sex;

    //
构造方法赋值
    Person(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    //show
方法返回某某 性别 年龄
    public String show() {
        return name+" "+sex+" "+age;
    }
}

运行结果截图

 

任务2声明一个Student类,继承Person类,增加id(int,学号)属性,通过构造方法,利用super调用父类构造方法来进行变量赋值。Override父类的show方法,返回String类型,内容如下:某某 男(女) 年龄 学号

处理思路

如题,在主类里用子类构造方法构造Student对象,并使用子类重写的show方法进行返回,输出结果

关键技术说明

super(name,age,sex);进行父类有参构造方法的调用,并记得要在父类里创建无参的构造方法(避免调用出错)。

程序源码

package q1;

public class test {
    public static void main(String args[]){
        Student a =new Student("
小红",18,'',1);
        Student b =new Student("
小明",19,'',2);
        Student c =new Student("
小黑",17,'',3);
        System.out.print(a.show());
        System.out.print('\n');
        System.out.print(b.show());
        System.out.print('\n');
        System.out.print(c.show());
    }
}

package q1;

public class Person {
    public String name;
    public int age;
    public char sex;

    //
构造方法赋值
    Person(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    //
无参数构造方法
    Person() {}

    //show
方法返回某某 性别 年龄
    public String show() {
        return name+" "+sex+" "+age;
    }
}
class Student extends Person{
    int id;
    Student(String name, int age, char sex,int id){
    super(name,age,sex);
    this.id=id;
    }
    public String show() {
        return name+" "+sex+" "+age+" "+id;
    }
}

运行结果截图

 

任务3:声明一个Shape抽象类,其中有计算面积(area)、周长(perimeter)的方法,有以下几个实现:Circle(圆),Rectangle(矩形),Triangle(三角形),都 有计算面积、周长的方法,并以多态的方式表示出来。

处理思路

跟题目一样

关键技术说明

抽象类的实现;

常量的定义;

程序源码

package p4;

import java.util.Scanner;

public class exp4 {
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        System.out.println("
请输入矩形长、宽");
        rectangle first=new rectangle(sc.nextDouble(),sc.nextDouble());
        System.out.println("
周长:"+first.perimeter());
        System.out.println("
面积:"+first.area());

        System.out.println("
请输入三角形底、高、其他两个边");
        triangle second=new triangle(sc.nextDouble(),sc.nextDouble(),sc.nextDouble(),sc.nextDouble());
        System.out.println("
周长:"+second.perimeter());
        System.out.println("
面积:"+second.area());

        System.out.println("
请输入圆形半径");
        circle third=new circle(sc.nextDouble());
        System.out.println("
周长:"+third.perimeter());
        System.out.println("
面积:"+third.area());
    }
}

package p4;

abstract class Shape {
    abstract double area();
    abstract double perimeter();
}

class rectangle extends Shape{
    double a;
    double b;
    rectangle(double a, double b){
        this.a=a;
        this.b=b;
    }
    @Override
    double area() {
        double s=a*b;
        return s;
    }
    @Override
    double perimeter() {
        double l=2*(a+b);
        return l;
    }
}
class triangle extends Shape{
    double a;
    double b;
    double c;
    double h;
    triangle(double a, double h, double c, double b){
        this.a=a;//
底边
        this.h=h;//
        this.b=b;
        this.c=c;
    }
    @Override
    double area() {
        double s=1.0/2*a*h;
        return s;
    }
    @Override
    double perimeter() {
        double l=a+b+c;
        return l;
    }
}
class circle extends Shape{
    public static final double PI = 3.14;
    double a;
    circle(double a){
        this.a=a;
    }
    @Override
    double area() {
        double s=PI*a*a;
        return s;
    }
    @Override
    double perimeter() {
        double c=2*PI*a;
        return c;
    }
}

运行结果截图

 

任务4设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。要求如下:

  1. 编写抽象类Animal

Animal抽象类有2个抽象方法cry()和getAnimaName(),即要求各种具体的动物给出自己的叫声和种类名称。

  1. 编写模拟器类Simulator

该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型。即参数animal可以调用Animal的子类重写的cry()方法播放具体动物的声音、调用子类重写的getAnimalName()方法显示动物种类的名称。

  1. 编写Animal类的子类:Dog,Cat类

图是Simulator、Animal、Dog、Cat的UML图。

编写主类Application(用户程序)

在主类Application的main方法中至少包含如下代码:

Simulator simulator = new Simulator();

simulator.playSound(new Dog());

simulator.playSound(new Cat());

处理思路

如题,只是注意在mian里将Simulator类的参数animal改为对应子类上转型对象即可以调用对应子类的重写方法

关键技术说明

Animal animal=new Dog();//animalDog()类上转型对象
        simulator.playSound(animal);
        simulator.playSound(new Cat());//这样写也是一样的效果

程序源码

package q2;

public class Application {

    public static void main(String[] args) {
        Simulator simulator=new Simulator();
        Animal animal=new Dog();//animal
Dog()类上转型对象
        simulator.playSound(animal);
        simulator.playSound(new Cat());//
这样写也是一样的效果
    }
}

package q2;

public abstract class Animal {
    //
叫声
    abstract void cry();
    //
种类名称
    abstract String getAnimalName();
}

class Dog extends Animal{
    String name="
";
    void cry(){
        System.out.println("
汪汪汪");
    }
    String getAnimalName(){
        return name;
    }
}

class Cat extends Animal{
    String name="
";
    void cry(){
        System.out.println("
喵喵喵");
    }
    String getAnimalName(){
        return name;
    }
}

package q2;

public class Simulator {
    void  playSound(Animal animal){
            System.out.print(animal.getAnimalName()+":");
            animal.cry();
    }
}

运行结果截图

 

任务5编写一个Java程序:(1)设计一个abstract类Employee,其中有一个abstract方法earnings();(2)设计Employee的二个子类YearWorker和MonthWorker,分别对应按年领取薪水(年薪为100000元)、按月领取薪水(月薪为5000元),子类必须重写父类的earnings()方法;(3)设计一个Company类,该类用Employee对象数组作为成员,Employee对象数组中的元素可以是YearWorker对象或MonthWorker对象的上转型对象(4)编写一个测试类,假设某公司共有10名员工,两种类型的员工各为5人(其中数组下标为奇数的员工为MonthWorker,其他为YearWorker),计算并输出该公司一年需要支付的薪水总额。

处理思路

如题,在Company类里构造带Employee数组参数

Employee[] em;
Company(Employee[] em){
    this.em=em;
}

在主类main里用

Employee[] em = new Employee[10];
Company a=new Company(em);
建立带Employee数组参数的Company类对象

a.em[i] = new YearWorker();//使Company类里的Employee数组元素为YearWorker对象或MonthWorker对象的上转型对象,后使上转型对象调用子类重写方法

关键技术说明

类里带数组参构造方法,数组元素为上转型对象进行子类重写方法调用。

程序源码。

package q3;

public class test {
    public static void main(String[] args) {
        Employee[] em = new Employee[10];
        Company a=new Company(em);
        double sum=0;
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0)
            {a.em[i] = new YearWorker(); //
上转型对象调用子类重写方法
                sum=sum+a.em[i].earnings();}
            else {em[i] = new MonthWorker();
                sum=sum+12*a.em[i].earnings();}
        }
        System.out.println("
一年需要支付的薪水总额:"+sum);
    }
}

package q3;

public abstract class Employee {
    abstract int earnings();
}

  class YearWorker extends Employee{
    int earnings(){
        int money=100000;
        return money;
    }
}
  class MonthWorker extends Employee{
    int earnings(){
        int money=5000;
        return money;
    }
}

package q3;

public class Company {
    Employee[] em;
    Company(Employee[] em){
        this.em=em;
    }
}

运行结果截图

任务6假定根据学生的3门学位课程的分数决定是否可以拿到学位,对于本科生,如果3门课程的平均分数超过60分即表示通过,而对于研究生,则需要平均超过80分才能通过。请完成以下java类的设计:(1)设计一个基类student描述学生的共同特征;(2)设计一个描述本科生的类Undergraduate,该类继承并扩展Student类;(3)设计一个描述研究生的类Graduate,该类继承并扩展Student类;(4)设计一个测试类StudentDemo,分别创建本科生和研究生这两个对象,并输出相关信息。

处理思路

如题

关键技术说明

子类方法调用;

方法数组参数、定义类型数组时一般直接[]里面无实数,除非new时

程序源码

package q4;
import java.util.Scanner;
public class StudentDemo {
    public static void main(String[] args){
    double g1[]=new double[3];
    double g2[]=new double[3];
    Scanner sc=new Scanner(System.in);
    System.out.println("
请输入研究生成绩");
    g1[0]=sc.nextDouble();
    g1[1]=sc.nextDouble();
    g1[2]=sc.nextDouble();
        Graduate a=new Graduate(g1);
        System.out.println("
是否通过:"+a.judge());

    System.out.println("
请输入本科生成绩");
    g2[0]=sc.nextDouble();
    g2[1]=sc.nextDouble();
    g2[2]=sc.nextDouble();
        Undergraduate b=new Undergraduate(g2);
        System.out.println("
是否通过:"+b.judge());
    }
}

package q4;

public class student {
    String sort;//
是研究生还是本科生
    double grades[];//3门学位课程的分数
}

class Undergraduate extends student{
    String sort="
本科生";
    Undergraduate(double grades[]){
        this.grades=grades;
    }
    public String judge(){
        double a;
        a=(grades[0]+grades[1]+grades[2])/3;
        if(a>60){
            return "
通过";
        }
        return "
不通过";
    }
}

class Graduate extends student{
    String sort="
本科生";
    Graduate(double grades[]){
        this.grades=grades;
    }
    public String judge(){
        double a;
        a=(grades[0]+grades[1]+grades[2])/3;
        if(a>80){
            return "
通过";
        }
        return "
不通过";
    }
}

运行结果截图

 

 

任务7定义一个复数类Complex,要求(1)显示该复数;(2)求两个复数的和,返回复数类对象;(3)求两个复数的差,返回复数类对象;(4)求两个复数的乘积,返回复数类对象;(5)判断两个复数是否相等,返回布尔类型。

处理思路

如题

关键技术说明

可以直接用Complex类返回、做参数;

Complex(int i,int j){

 x=i;

 y=j;

 }

用自定义方法进行复数显示:

public void showComp(){//控制显示格式

 if(y>=0)

 System.out.println(x+"+"+y+"i");

 else

 System.out.println(x+"-"+(-y)+"i");

}

程序源码

package q6;

import java.util.Scanner;

public class test{
    private static Scanner input;
    public static void main(String[] args){
        input=new Scanner(System.in);
        System.out.println("
输入两复数实部虚部");
        int i=input.nextInt();//
分别是两个复数的x,y
        int j=input.nextInt();
        int m=input.nextInt();
        int n=input.nextInt();

        Complex C;//
新建一个对象的引用,用于接受函数的返回的对象
        Complex C1=new Complex(i,j);
        Complex C2=new Complex(m,n);
        boolean b;//
用于接受判断是否相等时返回的boolean
        System.out.println("相加");
        C=Complex.addComp(C1,C2);
        C.showComp();
        System.out.println("
相减");
        C=Complex.subComp(C1,C2);
        C.showComp();
        System.out.println("
相乘");
        C=Complex.multiComp(C1,C2);
        C.showComp();
        System.out.println("
是否相等");
        b=Complex.equalComp(C1,C2);
        if(b)
            System.out.println("
相等");
        else
            System.out.println("
不相等");
    }
}

package q6;

import java.util.Scanner;
class Complex{
 public int x;
 public int y;
 Complex(){
 x=0;
 y=0;
 }
 Complex(int i,int j){
 x=i;
 y=j;
 }
public void showComp(){//
控制显示格式
         if(y>=0)
         System.out.println(x+"+"+y+"i");
         else
         System.out.println(x+"-"+(-y)+"i");
         }
static Complex addComp(Complex C1,Complex C2){//
复数相加 注意:同上题,函数返回值类型是对象;对象作形参;
        
Complex C=new Complex();
         C.x=C1.x+C2.x;
         C.y=C1.y+C2.y;
         return C;
         }
 static Complex subComp(Complex C1,Complex C2){//
复数相减
         Complex C=new Complex();
         C.x=C1.x-C2.x;
         C.y=C1.y-C2.y;
         return C;
         }
 static Complex multiComp(Complex C1,Complex C2){//
复数相乘
         Complex C=new Complex();
         C.x=C1.x*C2.x;
         C.y=C1.y*C2.y;
         return C;
         }
 static boolean equalComp(Complex C1,Complex C2){//
判断复数是否相等
         if(C1.x==C2.x&&C1.y==C2.y)
             return true;
         else
         return false;
         }
 }

运行结果截图

 

;