实验3:Java类、继承、多态

实验名称:实验3:Java类、继承、多态

一、实验目的

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

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

二、实验内容与结果

任务1求解一元二次方程ax2+bx+c=0的根,要求根据一元二次方程的判别式,分情况显示方程的根。

处理思路:先求出判别式解,计算解,后通过if-else语句进行对判别式的判断,分情况显示方程的根。

关键技术说明

if-else语句

程序源码:

import java.util.Scanner;
import static java.lang.Math.sqrt;

public class ex1{
    public static void main(String[] args){
         int a;
         int b;
         int c;//
三个系数
        double x1;
        double x2;//
两个解
        double delta;//判别式值
        //输入系数值
        System.out.println("请依次输入一元二次方程abc三个系数");
        Scanner sc=new Scanner(System.in);
        a=sc.nextInt();
        b=sc.nextInt();
        c=sc.nextInt();

        delta=b*b-4*a*c;
        x1=(-b+sqrt(delta))/(2*a);
        x2=(-b-sqrt(delta))/(2*a);

        if(delta>0){
            System.out.println("
该一元二次方程两个解为:");
            System.out.println("x1="+x1+'\n'+"x2="+x2);
        }
        else if(delta==0){
            System.out.println("
该一元二次方程单个解为:");
            System.out.println("x1=x2="+x1);
        }
        else{
            System.out.println("
该一元二次方程没有解");
        }
    }
}

运行结果截图:

 

任务2构造一个银行账户类,类的构成包括如下内容:

  1. 数据成员用户的账户名称、用户的账户余额(private数据类型)
  2. 方法包括开户(设置账户名称及余额),利用构造方法完成
  3. 查询余额。
  4. 取款
  5. 存款

处理思路:

创建银行账户类,成员变量,方法,然后在主类中进行调用操作

关键技术说明:

引用类,要声明、新建开辟空间后进行操作;

循环进行菜单switch前面加上while(true)。

程序源码:

//account

import java.util.*;
public class account {
    private String name;
    private double stay;
    Scanner sc=new Scanner(System.in);
    //
开户
    public void account(){
        System.out.println("
请创建账户名称");
        name=sc.next();
        System.out.println("
请创建账户余额");
        stay=sc.nextDouble();
    }
    //
查询余额
    public void seek(/*String name*/){
        System.out.println("
账户余额为:"+stay);
    }
    //
取款
    public double take(/*String name*/){
        double out;
        System.out.println("
请输入您的取款金额:");
        out=sc.nextDouble();
        stay=stay-out;
        return stay;
    }
    //
存款
    public double put(/*String name*/){
        double in;
        System.out.println("
请输入您的存款金额:");
        in=sc.nextDouble();
        stay=stay+in;
        return stay;
    }
}

//主类

import java.util.Scanner;
class ex1{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        account x=new account();
        while(true) {
            System.out.println("
请输入您的操作选择");
            System.out.println("1
:开户" + "2:查询余额" + "3:存款" + "4:取款"+'\n'+"请输入其他任意数退出");
            int a = sc.nextInt();
            switch (a) {
                case (1):
                    x.account();
                    break;
                case (2):
                    x.seek();
                    break;
                case (3):
                    x.put();
                    break;
                case (4):
                    x.take();
                    break;
                default:
                    return ;
            }
        }
    }
}

运行结果截图

 

任务3使用面向对象的概念表示出下面的生活场景:小明去超市买东西,所有买到的东西都放在购物车之中,最后到收银台一起结账。(具体内容不限于此)

处理思路

将商品搞一个父类,里面包括名称、(static)价格、数量个数两个基本属性,并使用构造方法输入要买的对应商品个数。将具体商品分成若干子类赋值名称、价格。

在购物车类里进行商品构造方法的使用,输入具体商品个数,并调用对应具体商品价格,求和输出总价。

关键技术说明

父类子类extends的使用;

构造方法的使用;

static的使用;

程序源码

package p2;
import java.util.Scanner;

public class Backet {
    public static void main(String[] args){
    double sum;
    Scanner sc=new Scanner(System.in);
        System.out.println("
请输入购买香肠个数:");
        int num1=sc.nextInt();
        System.out.println("
请输入购买面包个数:");
        int num2=sc.nextInt();
        System.out.println("
请输入购买牙膏个数:");
        int num3=sc.nextInt();
        System.out.println("
请输入购买酸奶个数:");
        int num4=sc.nextInt();

    Goods a=new Goods("
香肠",num1);
    Goods b=new Goods("
面包",num2);
    Goods c=new Goods("
牙膏",num3);
    Goods d=new Goods("
酸奶",num4);

    sum= good1.price*a.number+good2.price*b.number+good3.price*c.number+good4.price*d.number;

    System.out.println("
总额为:"+sum);
    }
}

package p2;

public class Goods {
    public String name;//
商品名
    public double price;//价格
    public int number;//数量
    Goods() {
    }//
无参构造函数

    Goods(String names, int num)//有参构造函数
    {
        name = names;
        number = num;
    }
}

class good1 extends Goods{
    static String name ="
香肠";
    static double price =3;
    }

class good2 extends Goods{
    String name ="
面包";
    static double price =10;
}

class good3 extends Goods{
    String name ="
牙膏";
    static double price =5;
}

class good4 extends Goods{
    String name ="
酸奶";
    static double price =6;
}

运行结果截图

任务4设计一个名为MyPoint的类,表示一个带x坐标和y坐标的点。该类包括:(1)两个带get方法的数据域x和y,分别表示它们的坐标;(2)一个创建(0,0)的无参构造方法;(3)一个创建特定坐标点的构造方法;(4)两个数据域x和y各自的get方法;(5)返回MyPoint类型的两个点之间的距离;(6)实现测试类。

处理思路

创建了Mypoint类创建表示坐标的成员变量,输入坐标的构造方法,并创建计算距离、输出的方法

关键技术说明

用数组进行数据存储,设计类的变量和方法

程序源码

package p3;
public class exp3 {
        public static void main(String args[]) {
            MyPoint distance=new MyPoint();
            distance.getDistance();
            distance.shuchu();
        }
    }

package p3;

import java.util.Scanner;

public class MyPoint {
double x;//
横坐标
double y;//纵坐标
MyPoint(){
}
MyPoint(double x,double y){
    this.x=x;
    this.y=y;
}
double getx(){
    return x;
}
double gety(){
    return y;
  }


        double distance;//
两个点的距离

        Scanner sc=new Scanner(System.in);
        double getDistance(){
            double a[]={0,0,0,0};//
存放坐标值
            System.out.println("请输入两个点的坐标");
            for(int i=0;i<4;i++){
                a[i]=sc.nextDouble();
            }
         MyPoint point1=new MyPoint(a[0],a[1]) ;
         MyPoint point2=new MyPoint(a[2],a[3]) ;
         double i=(point1.x-point2.x)*(point1.x-point2.x)+(point1.y-point2.y)*(point1.y-point2.y);
         distance=Math.sqrt(i);
         return distance;
        }

        void shuchu(){//
输出距离值
            System.out.println("两个点间距离为");
            System.out.println(distance);
        }
    }

运行结果截图

 

任务5定义一个Shape类,用来表示一般二维图形。Shape具有抽象方法area和perimeter,分别用来计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形等),这些类均为Shape的子类。编写一个主类,实现多态要用上转型对象

处理思路

跟题目一样

关键技术说明

抽象类的实现;

常量的定义;

程序源码

package p4;

import java.util.Scanner;

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

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

        System.out.println("
请输入圆形半径");
        a=new circle(sc.nextDouble());
        System.out.println("
周长:"+a.perimeter());
        System.out.println("
面积:"+a.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;
    }
}

运行结果截图

 

任务6定义Circle2D类,包括:(1)一个无参构造方法,该方法创建一个中心点(x,y)为(0,0)且半径为1的默认圆;(2)一个构造方法,创建 中心点和半径的圆;(3)返回圆面积和周长;(4)contains(Circle2D circle)判定一个圆是否在圆内,并返回布尔型;(5)判定两个圆是否重叠overlaps(Circle2D circle1,Circle2D circle2);(6)测试类

处理思路

定义关键x、y、r成员变量,构造输入中心点、半径方法,创建进行返回面积、周长、判断是否重叠、是否在圆内方法。

关键技术说明

用了boolean

程序源码

package p5;

public class Circle2D {
    private double x;
    private double y;
    private double r;

    //
创建默认圆
    Circle2D(){
        this.x=0;
        this.y=0;
        this.r=0;
    }
    //
创建圆
    Circle2D(double x,double y,double r){
        this.x=x;
        this.y=y;
        this.r=r;
    }
    //
返回面积
    public double getArea(){
        return Math.PI*r*r;
    }
    //
返回周长
    public double getCircle(){
        return 2*Math.PI*r;
    }
    //
判断一个圆是否在圆内
    public boolean contains(Circle2D circle){
        if(Math.sqrt((this.x-circle.x)*(this.x-circle.x)+(this.y-circle.y)*(this.y-circle.y))+circle.r<=this.r) {
        return true;
        }
        return false;
    }
    //
判断圆是否重叠
    public boolean overlaps(Circle2D circle1,Circle2D circle2){
        if(circle1.x==circle2.x&&circle1.y==circle2.y&&circle1.r==circle2.r){
            return true;
        }
        return false;
    }
}

package p5;

public class exp5 {
    public static void main(String args[]){
    Circle2D c1=new Circle2D(3,3,8);
    Circle2D c2=new Circle2D(4,2,7);
    Circle2D c3=new Circle2D(4,2,7);
    System.out.println("
输出c1面积");
    System.out.println(c1.getArea());
    System.out.println("
输出c1周长");
    System.out.println(c1.getCircle());
    System.out.println("c1
是否包含c2");
    System.out.println(c1.contains(c2));
    System.out.println("c2
是否与c3重叠" );
    System.out.println(c2.overlaps(c2,c3));
    }
}

运行结果截图

 

 

任务7定义一个表示学生信息的类,要求如下:(1)学生的属性包括:学号、姓名、性别、年龄和课程成绩(5门课,其中包括Java);(2)创建带参数的构造方法;(3)获取学生的属性信息;(4)根据学生类,创建五个该类地对象,要求对象数组,并打印五个学生的Java课程成绩的平均值,并输出成绩的最大值(分数和学生名)和最小值(分数和学生名)。

处理思路

学生类里成员变量,构造方法,然后在主类中进行中值、最高分、最低分计算

关键技术说明

使用对象数组

程序源码

package p6;

public class exp6 {
    public static void main(String[] args) {
        Stu stu[] = new Stu[5];
        stu[0] = new Stu(1, "
小明", '', 18, 97, 94, 95, 96, 88);
        stu[1] = new Stu(2, "
小红", '', 17, 90, 90, 91, 91, 86);
        stu[2] = new Stu(3, "
小呀", '', 19, 60, 70, 80, 94, 83);
        stu[3] = new Stu(4, "
小男", '', 18, 77, 94, 60, 95, 81);
        stu[4] = new Stu(5, "
小金", '', 18, 85, 100, 93, 97, 86.5);
        double aver = (stu[0].grades[3] + stu[1].grades[3] + stu[2].grades[3] + stu[3].grades[3] + stu[4].grades[3]) / 5;
        System.out.println("
输出平均值"+aver);
        double max = stu[0].grades[3];
        double min = stu[0].grades[3];
        int i = 0, j = 0, k = 0;
        for (; i < 5; i++) {
            if (max < stu[i].grades[3]) {
                max = stu[i].grades[3];
                j = i;
            }
        }
        System.out.println("
输出java最高分" + max + stu[j].name);

        for (i=0; i < 5; i++) {
            if (min > stu[i].grades[3]) {
                min = stu[i].grades[3];
                k = i;
            }
        }
        System.out.println("
输出java最低分" + min + stu[k].name);
    }
}

package p6;

public class Stu {
    int num;
    String name;
    char gender;
    int age;
    double grades[] = new double[5];

    Stu(int a, String b, char c, int d, double e, double f, double g, double h, double i) {
        this.num = a;
        this.name = b;
        this.gender = c;
        this.age = d;
        this.grades[0] = e;
        this.grades[1] = f;
        this.grades[2] = g;
        this.grades[3] = h;
        this.grades[4] = i;
    }

    public int getNum() {
        return num;
    }

    public String getName() {
        return name;
    }

    public char getGender() {
        return gender;
    }

    public int getAge() {
        return age;
    }

    public double getChinese() {
        return grades[0];
    }

    public double getMath() {
        return grades[1];
    }

    public double getEnglish() {
        return grades[2];
    }

    public double getJava() {
        return grades[3];
    }

    public double getC() {
        return grades[4];
    }
}

运行结果截图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值