Java课程实验报告实验四——面向对象—继承

一、实验目的
1.理解面向对象编程,尤其是继承的思想,学习通过继承,在父类的基础上创建子类
2.使用关键字super调用父类的构造方法和方法
3.在子类中覆盖方法

二、实验内容

1. 【三角形类Triangle】设计一个名为Triangle的类来扩展GeometricObject类。该类包括:
(1)三个名为side1、side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0。
(2)一个无参构造方法创建默认的三角形。
(3)一个能创建带指定side1、side2和side3的三角形的构造方法。
(4)所有三个数据域的访问器方法。
(5)一个名为getArea()的方法返回这个三角形的面积。计算三角形面积的公式参见实验1练习题2.19。
(6)一个名为getPerimeter()的方法返回这个三角形的周长。
(7)一个名为toString()的方法返回这个三角形的字符串描述,显示三角形的三边长、周长及面积。

目标输出任务:
画出Triangle类和GeometricObject类的UML图。
实现这些类。
编写一个测试程序,创建边长为1、1.5和1,颜色为yellow,filled为true的Triangle对象,然后显示它的三边长、周长、面积、颜色以及是否被填充。

2. 【Circle2D类】定义Circle2D类,包括:
(1)两个带有get方法的名为x和y的double型数据域,表明圆的中心点。
(2)一个带get方法的数据域radius。
(3)一个无参构造方法,该方法创建一个(x,y)值为(0, 0)且radius为1的默认圆。
(4)一个构造方法,创建带指定的x、y和radius的圆。
(5)一个返回圆面积的方法getArea()。
(6)一个返回圆周长的方法getPerimeter()。
(7)如果给定的点(x, y)在圆内,那么方法contains(double x, double y)返回true。如图a所示。
(8)如果给定的圆在这个圆内,那么方法contains(Circle2D circle)返回true。如图b所示。
(9)如果给定的圆和这个圆重叠,那么方法overlaps(Circle2D circle)返回true。如图c所示。
Java课程实验报告实验四——面向对象—继承_第1张图片
目标输出任务:
画出该类的UML图。
实现这个类。
编写测试程序,创建一个Circle2D对象c1(new Circle2D(2, 2, 5.5)),显示它的面积和周长,还要显示c1.contains(3, 3)、c1.contains(new Circle2D(4, 5, 10.5))和c1.overlaps(new Circle2D(3, 5, 2.3))。

三、实验报告
1、 三角形Triangle类
A. UML类图绘制
Java课程实验报告实验四——面向对象—继承_第2张图片
B. 实验运行
首先根据提示输入三个边的值(在这里使用题例中的数据);
Java课程实验报告实验四——面向对象—继承_第3张图片
回车后,数据存入;
再根据提示输入表示颜色的字符串和是否被填充(填充为true,不填充为false);
Java课程实验报告实验四——面向对象—继承_第4张图片
回车,返回含面积数据,周长数据,颜色,是否填充的文本;
Java课程实验报告实验四——面向对象—继承_第5张图片
若输入的数据不能组成一个三角形,则面积返回0,周长不返回;
Java课程实验报告实验四——面向对象—继承_第6张图片
若输入的判定条件错误,则默认false
Java课程实验报告实验四——面向对象—继承_第7张图片
C. 结果分析
首先先将父类GeometricObject类按书中内容创建出来,再根据题目要求设置三个私有属性size1,size2,size3,将三个size的get函数,含参的构造函数,无参构造函数, getArea(),getPerimeter()函数实现,其中getArea函数使用海伦公式,getPerimeter函数直接计算,再将toString函数重写,如果getArea的海伦公式返回值小于等于0,不返回周长值,面积值返回0,;如果返回值大于0,返回面积周长值,颜色值和是否填充均通过使用super函数调用父类原方法,其中颜色值为子类main函数中的字符串,是否填充需要判定,如果是true,filled为true,否则false,再根据内容输出即可。

2、圆形Circle2D类
A. UML类图
Java课程实验报告实验四——面向对象—继承_第8张图片
B. 实验运行
直接运行,返回圆的周长值和与其他三个圆的位置关系
Java课程实验报告实验四——面向对象—继承_第9张图片
C. 结果分析
首先根据题目要求创建私有属性x,y,radius,再创建每个属性的get方法,然后创建有参和无参的构造方法,再创建getArea()和getPerimeter()函数,重点是创建contains函数和overlaps函数,针对传入的点(如果传入的是实例,则用this指针指向其属性),计算两个圆心之间的距离,其中contains函数判定距离是否小于两个半径的差值,如果小于返回true,否则返回false;overlaps函数判定距离是否在两个半径差值和两个半径和值之间,如果在返回true,否则返回false;完成之后在main函数内部进行处理,创建一个题例中数据的Circle2D对象c1,然后再使用contains函数和overlaps函数调用题例进行处理即可完成实验要求。
3、题目要求和实验要求的对接
本次实验
A.要求对父类和子类的概念与继承进行进一步的理解,在第一个实验中则使用到了继承知识;
B.要求熟悉super语句和this语句的操作,super语句可以调用父类的方法和属性,在第一个实验中则用到了super语句;this语句可以调用自身的属性和方法,在第二个实验中则用到了this语句;
C.要求熟悉子类的方法重写,在第一个实验中对toString方法进行了重写。

四、实验心得
本次实验是对Java面向对象编程的三大重要特性:继承特性的一个初步实践,难度不大且具有针对性,在练习之前我本身对super语句的使用不是特别熟悉,在经过本次实验的应用后我了解到super语句的基础用法,以及其不能在main函数中用的一个小tips,同时在实例的应用上有了新的一步。
建议:暂无,题目很有针对性的

【源代码】

GeometricObject.java
package exp4;
import java.util.Date;

import org.omg.PortableServer.THREAD_POLICY_ID;

public class GeometricObject {
	private String color;
	private boolean filled;
	private Date dateCreated;
	
	
	public GeometricObject() {
		
	}
	public GeometricObject(String color,boolean filled) {
		
	}
	public String getColor(){
		return this.color;
	}
	public void setColor(String color){
		this.color = color;
	}
	public boolean isFilled(){
		return this.filled;
	}
	public void setFilled(boolean filled){
		this.filled = filled;
	}
	public Date getDateCreated(){
		return this.dateCreated;
	}
	public String toString(){
		return "created on " + dateCreated + "\ncolor " + color + " and filled " + filled;
	}
}
Triangle.java
package exp4;

import java.util.Date;
import java.util.Scanner;

public class Triangle extends GeometricObject{
	private double size1 = 1.0;
	private double size2 = 1.0;
	private double size3 = 1.0;
	public Triangle(){
		
	}
	public Triangle(double size1,double size2,double size3){
		this.size1 = size1;
		this.size2 = size2;
		this.size3 = size3;
	}
	public double getSize1() {
		return size1;
	}
	public double getSize2() {
		return size2;
	}
	public double getSize3() {
		return size3;
	}
	public double getArea(){
		double sum = (size1 + size2 + size3) / 2.0;
		if(sum * (sum - size1) * (sum - size2) * (sum - size3) <= 0){
			return 0;
		}
		else{
			double area = Math.sqrt(sum * (sum - size1) * (sum - size2) * (sum - size3));
			return area;
		}
		
	}
	public double getPerimeter(){
		return size1 + size2 + size3;
	}
	
	
	public String toString(){
		if(getArea() != 0){
			return super.toString() + "\narea " + getArea() + " and perimeter " + getPerimeter();
		}
		else {
			return super.toString() + "\narea " + getArea();
		}
	}
	
	
public static void main(String[] args) {
		double size1,size2,size3;
		System.out.println("请输入三角形的三个边长: ");
		Scanner input = new Scanner(System.in);
		size1 = input.nextDouble();
		size2 = input.nextDouble();
		size3 = input.nextDouble();
		Triangle triangle = new Triangle(size1,size2,size3);
		System.out.println("请输入这个三角形的颜色和是否被填充");
		String color = input.next();
		String filled = input.next();
		triangle.setColor(color);
		if(filled == "true")
		triangle.setFilled(true);
		else 
		triangle.setFilled(false);
		String re = triangle.toString();
		System.out.println(re);
	}
}
Circle2D.java
package exp4;

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Circle2D {
	private double x;
	private double y;
	private double radius;
	
	public double getX() {
		return x;
	}
	public double getY() {
		return y;
	}
	public double getRadius() {
		return radius;
	}
	public Circle2D(){
		x = 0;
		y = 0;
		radius = 1;
	}
	public Circle2D(double x,double y,double radius){
		this.x = x;
		this.y = y;
		this.radius = radius;
	}
	public double getArea(){
		return Math.PI * radius * radius;
	}
	public double getPerimeter() {
		return 2 * Math.PI * radius;
	}
	public boolean contains(double x,double y){
		double distance = Math.sqrt((x - this.x) * (x - this.x) + (y - this.y) * (y - this.y));
		if(distance < radius)return true;
		else return false;
	}
	public boolean contains(Circle2D circle){
		double distance = Math.sqrt((circle.getX() - this.x) * (circle.getX() - this.x) + (circle.getY() - this.y) * (circle.getY() - this.y));
		if(distance < radius - circle.radius)return true;
		else return false;
	}
	public boolean overlaps(Circle2D circle){
		double distance = Math.sqrt((circle.getX() - this.x) * (circle.getX() - this.x) + (circle.getY() - this.y) * (circle.getY() - this.y));
		if(distance > Math.abs(radius - circle.radius) && distance < radius + this.radius)return true;
		else return false;
	}
	public static void main(String[] args) {
		Circle2D c1 = new Circle2D(2,2,5.5);
		System.out.println("这个圆的面积为: " + c1.getArea());
		System.out.println("这个圆的周长为: " + c1.getPerimeter());
		System.out.println(c1.contains(3,3)+ " " + c1.contains(new Circle2D(4,5,10.5)) + " " + c1.overlaps(new Circle2D(3,5,2.3)));
		
	}
	
}

你可能感兴趣的:(Java)