实验名称:实验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("请依次输入一元二次方程a、b、c三个系数");
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:构造一个银行账户类,类的构成包括如下内容:
- 数据成员用户的账户名称、用户的账户余额(private数据类型)
- 方法包括开户(设置账户名称及余额),利用构造方法完成
- 查询余额。
- 取款
- 存款
处理思路:
创建银行账户类,成员变量,方法,然后在主类中进行调用操作
关键技术说明:
引用类,要声明、新建开辟空间后进行操作;
循环进行菜单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];
}
}
运行结果截图