一、实验目的
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所示。
目标输出任务:
画出该类的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类图绘制
B. 实验运行
首先根据提示输入三个边的值(在这里使用题例中的数据);
回车后,数据存入;
再根据提示输入表示颜色的字符串和是否被填充(填充为true,不填充为false);
回车,返回含面积数据,周长数据,颜色,是否填充的文本;
若输入的数据不能组成一个三角形,则面积返回0,周长不返回;
若输入的判定条件错误,则默认false
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类图
B. 实验运行
直接运行,返回圆的周长值和与其他三个圆的位置关系
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)));
}
}