《Java程序设计》实验指导——项目4 继承与接口

项目4 继承与接口

实验目的

掌握类继承的实现;掌握方法的继承、重载与覆盖;理解子类构造方法与父类构造方法之间的关系;理解抽象类和抽象方法;理解接口的定义;掌握接口的实现。

实验性质

验证性实验+设计性实验

实验内容

(1)分析调试教材的第4章中的实例
(2)根据下面的要求实现圆类Circle

  • 成员变量:radius
  • 方法:
    • 构造方法: Circle(),将半径置为0;
      Circle(int r),将半径置初始化为r;
    • 修改器/访问器:对半径进行操作;
    • double getPerimeter();获得圆的周长;
    • double getArea();获得圆的面积;
    • void show();将圆的半径、周长、面积输出
import java.math.BigDecimal;

public class Exercises2 {
    
    
	
	public static void main(String[] args) {
    
    
	
		Circle user = new Circle();
		user=new Circle(3);
		System.out.println("圆的半径为"+user.get());                //调用get方法,获取半径
		user.set(5);                                                //调用set方法,设置半径
		System.out.println("圆的半径更改为"+user.get());             //调用get方法,获取更改后的半径
		System.out.println("该半径圆的周长为"+user.getPerimeter());  //调用getPerimeter方法,获取周长
		System.out.println("该半径圆的面积为"+user.getArea());       //调用getArea方法,获取面积
		System.out.println("show方法:");
		user.show(user.getPerimeter());                             //调用show方法
	}
}

class Circle{
    
    
	private static final double PI = 3.14;
	int r;
	double perimeter;
	double area;
	public Circle() {
    
    
		r=0;
	}
	public Circle(int r) {
    
    
		this.r=r;
	}
	void set(int r) {
    
    
		this.r=r;
	}
	double get() {
    
    
		return r;
	}

	BigDecimal getPerimeter() {
    
                                   //计算面积
		BigDecimal a = BigDecimal.valueOf(2*r);     //高精度计算使用BigDecimal类
		BigDecimal b = BigDecimal.valueOf(PI);
		BigDecimal c = a.multiply(b);
		return c;
		}
	double getArea() {
    
    
		area=r*r*PI;
		return area;
	}

	void show(BigDecimal perimeter) {
    
    
		System.out.println("半径:"+r);
		System.out.println("周长:"+perimeter);
		System.out.println("面积:"+area);
	}
}

(3)编写一个程序,用于创建一个名为Employee的父类和两个名为Manager和Director的子类。要求创建Manager和Director的对象,并显示其详细信息。

  • Employee类:属性(name,sex,address)
  • 方法show()显示这些属性
  • Manager类:属性(department),重写show方法
  • Director类:属性(lengthOfService),重写show方法
public class Exercises3 {
    
    
	
	public static void main(String[] args) {
    
    
	
		Employee user1 = new Employee();
		user1.show();
		Employee user2 = new Manager();
		user2.show();
		Employee user3 = new Director();
		user3.show();
	}
}

class Employee{
    
    
	String name = "轩轩同学";
	String sex = "男";
	String address = "XXXXX";
	void show(){
    
    
		System.out.println("姓名:"+name);
		System.out.println("性别:"+sex);
		System.out.println("地址:"+address);
	}
}

class Manager extends Employee{
    
    
	String department = "XXX工程";
	void show(){
    
    
		System.out.println("部门:"+department);
	}
}

class Director extends Employee{
    
    
	String lengthOfService = "XXXX";
	void show() {
    
    
		System.out.println("职务:"+lengthOfService);
	}
}

(4)定义如下的类

1.Point类:用于描述坐标系中的一个点

  • 属性:x、y,int类型,分别描述x坐标值和y坐标值;
  • 方法:int distanceTo(Point p):计算两点之间的距离;
    Point centerPoint(Point p):求两点之间的中心点;
  • Graphic抽象类:描述图形信息
  • 属性:color(String类型,图形颜色)
  • 方法:
    构造方法:2个
    无参的(颜色为空)
    有参的(根据参数设置颜色信息)
    void printInfo():显示图形信息
    抽象方法:double getArea() 功能:计算图形面积
    抽象方法:double getCircum() 功能:计算图形周长

2.Rect类:继承了Graphic类,用于描述矩形图形

  • 添加属性: lefttop和rightbottom,均为Point类型,分别描述矩形的左上角和右下角点的坐标信息;

方法:

  • 构造方法3个;
  • 无参格式:利用基类无参构造方法设置基类部分信息,将两个点均设置为坐标原点;
  • Rect(String color, Point lefttop, Point rightbottom)
  • Rect(String color, int x_left, int y_top, int x_right, int y_bottom)
  • 重写方法:getArea(),getCircum(),printInfo() 根据矩形信息进行相关处理;
  • 添加方法:int getHeight(),求出矩形的高;
  • int getWidth(),求出矩形的宽;
  • boolean isRect():基于两点信息判断是否构成矩形;

3.Circle类继承了Graphic类,用于描述圆形图形

  • 添加属性:center,为Point类型,描述圆形的圆心;

  • r,int类型,描述圆形半径

  • 方法:

    • 构造方法:根据实际需要,自行设定;
    • 重写方法:getArea(),getCircum(), printinfo()根据圆形信息进行相关处理;
    • 添加方法:
    • void setinfo (string color, point center, int r):根据参数设置圆形的属性
    • void changeSize(int):根据参数缩放圆形大小(提示:对半径进行修改)
    • 定义主程序类,分别创建矩形对象和圆形对象,并对其操作验证类定义是否正确;同时练习向上转型和向下转型,加深对面向对象的多态性的理解。
public class Exercises4 {
    
    
	
	public static void main(String[] args) {
    
    
		Point a = new Point(1,1);
		Point b = new Point(3,3);
		Point x = new Point();
		x.printPoint(a, b);  System.out.println("间隔距离为"+b.distanceTo(a));
		x=b.centerPoint(a);  
		x.printPoint(a, b);  System.out.println("中心点为"+"("+x.x+","+x.y+")");

		//矩形
		Rect c = new Rect("红色",a,b);
		x.printPoint(a, b);  System.out.println("是否可以围成矩形?   "+c.isRect());
		x.printPoint(a, b);  System.out.println("围成矩形的面积为"+c.getArea());
		x.printPoint(a, b);  System.out.println("围成矩形的周长为"+c.getCircum()+"   长为"+c.getHeight()+"   宽为"+c.getWidth()+"  "+c.getHeight()+"  "+c.getWidth());
		Point a1=new Point(5,5);
		Point b1=new Point(7,7);
		Point x1=new Point(6,6);
		Rect c1 = new Rect("绿色",a1,b1);
		Graphic example2;
		example2=c1;
		x.printPoint(a, b);System.out.print("围成的矩形 与");
		x.printPoint(a1, b1);System.out.println("围成的矩形    "+c.compareTo(example2));
		System.out.print("("+x1.x+","+x1.y+")是否在");x.printPoint(a, b);System.out.println("围成的矩形里?"+c.pointIsIn(x1));
		
		
		//圆形
		Graphic example1;
		Point first = new Point(0,0);
		Circle2 d =new Circle2(first,4);
		Point second = new Point(51,51);
		Circle2 d2 = new Circle2(second,3);
		System.out.println("以("+first.x+","+first.y+")为圆心,半径为4的圆的面积为"+d.getArea()+"   周长为"+d.getCircum());
		example1=d2;
		System.out.println("“圆心为("+d.Center.x+","+d.Center.y+") 半径为"+d.r+"的圆”  与  "
				+ "“圆心为("+d2.Center.x+","+d2.Center.y+") 半径为"+d2.r+"的圆”  "+d.compareTo(example1));
		System.out.print("("+second.x+","+second.y+")是否在以("+first.x+","+first.y+")为圆心,半径为4的圆里");System.out.println(d.pointIsIn(second));
		
		
		//向上转型
		Graphic e =c;
		e.printInfo();
		
		//向下转型
		Graphic f = null;
		if(e instanceof Rect) {
    
    
			c=(Rect)e;
			System.out.println("c=(Rect)e  "+"向下转型成功");
		}
		else {
    
    
			
		}
		if(f instanceof Rect) {
    
    
			c=(Rect)f;
		}
		else
			System.out.println("c=(Rect)f  "+"向下转型失败");
		
	}
	
}

//点类
class Point{
    
    
	double x;
	double y;
	Point(){
    
      }
	public Point(int x,int y) {
    
    
		this.x=x;
		this.y=y;
	}
	double distanceTo(Point p) {
    
    
		return Math.sqrt((this.x-p.x)*(this.x-p.x)+(this.y-p.y)*(this.y-p.y));
	}
	Point centerPoint(Point p) {
    
    
		Point x = new Point();
		x.x=(p.x+this.x)/2;
		x.y=(p.y+this.y)/2;
		return x;
	}
	public void printPoint(Point a,Point b) {
    
    
		System.out.print("("+a.x+","+a.y+")与("+b.x+","+b.y+")");
	}
	public boolean equals(Point x2) {
    
    
		if(this.x==x2.x&&this.y==x2.y)
			return false;
		return true;
	}
}


//图形类
abstract class Graphic{
    
    
	String color;
	public Graphic() {
    
    
		color="无色";
	}
	public Graphic(String color) {
    
    
		this.color=color;
	}
	void printInfo() {
    
    };
	abstract double getArea();
	abstract double getCircum();
}


//矩形类
class Rect extends Graphic implements GraphicOperate{
    
    
	
	Point lefttop=new Point();     
	Point rightbottom = new Point();
	
	public Rect(){
    
    
		lefttop.x=0;        
		lefttop.y=0;
		rightbottom.x=0;    
		rightbottom.y=0;
	}
	public Rect(String color, Point lefttop, Point rightbottom) {
    
    
		this.color=color;         
		this.lefttop=lefttop;         
		this.rightbottom=rightbottom;
	}
	public Rect(String color, int x_left, int y_top, int x_right, int y_bottom){
    
    
		this.color=color;
		this.lefttop.x=x_left;
		this.lefttop.y=y_top;
		this.rightbottom.x=x_right;
		this.rightbottom.y=y_bottom;
	}
	
	double getArea(){
    
              //返回矩形面积
		return (lefttop.x-rightbottom.x)*(lefttop.y-rightbottom.y);
	}
	
	double getCircum(){
    
            //返回矩形周长
		return Math.abs((lefttop.x-rightbottom.x)*2+(lefttop.y-rightbottom.y)*2);
	}
	
	void printInfo(){
    
               //输出矩形信息
		System.out.print("调用输出函数输出结果:");
		System.out.print("面积:"+getArea());
		System.out.print("  周长:"+getCircum());
		System.out.print("  颜色:"+this.color);       System.out.println();
	};
	
	double getHeight() {
    
             //获取高
		return Math.abs(lefttop.y-rightbottom.y);
	}
	
	double getWidth() {
    
              //获取宽
		return Math.abs(lefttop.x-rightbottom.x);
	}
	
	boolean isRect() {
    
                //判断是否能够成矩形 两点不同能构成 两点相同则不能
		if(this.lefttop.equals(this.rightbottom))
			return true;
		return false;
	}
	
	public String compareTo(Graphic example) {
    
    
		Rect p = new Rect();
		if(example instanceof Rect) {
    
    
			p=(Rect)example;
			Point center1 = new Point();
			center1.x=Math.abs((p.rightbottom.x+p.lefttop.x)/2);
			center1.y=Math.abs((p.rightbottom.y+p.lefttop.y)/2);
			Point center2 = new Point();
			center2.x=Math.abs((this.rightbottom.x+this.lefttop.x)/2);
			center2.y=Math.abs((this.rightbottom.y+this.lefttop.y)/2);
			
			if((Math.abs(center1.x-center2.x)>=(p.getWidth()/2+this.getWidth()/2))&&(Math.abs(center1.y-center2.y)>=(p.getHeight()/2+this.getHeight()/2))) {
    
    
				return "不相交";
			}
			else {
    
    
				return "相交";
			}
		}
		return "转型失败";
		}
	public boolean pointIsIn(Point example) {
    
    
		if(example.x>this.lefttop.x&&example.x<this.rightbottom.x&&example.y>this.lefttop.y&&example.y<this.rightbottom.y) {
    
    
			return true;
		}
		return false;
	}
}


//圆形类
class Circle2 extends Graphic implements GraphicOperate{
    
    
	Point Center = new Point();
	int r;
	Circle2(){
    
    
		
	}
	public Circle2(Point Center2,int r) {
    
           //构造函数设置初始化r
		this.r=r;
		Center=Center2;
	}
	double getArea() {
    
                 //计算圆的面积
		return 3.14*r*r;
	}
	double getCircum() {
    
               //计算圆的周长
		return 3.14*2*r;
	}
	void changeSize(int r) {
    
            //修改r
		this.r=r;
	}
	public String compareTo(Graphic example) {
    
    
		Circle2 p= new Circle2();
		if(example instanceof Circle2) {
    
    
			p=(Circle2)example;
		if(((this.Center.x)-(p.Center.x))*((this.Center.x)-(p.Center.x))+((this.Center.y)-(p.Center.y))*((this.Center.y)-(p.Center.y))>this.r+p.r)
		    return "相离";
		else if(((this.Center.x)-(p.Center.x))*((this.Center.x)-(p.Center.x))+((this.Center.y)-(p.Center.y))*((this.Center.y)-(p.Center.y))==this.r+p.r)
			return "相切";
		else
			return "相交";
	}
		return "转型失败";
	}

	public boolean pointIsIn(Point example) {
    
    
		if(((this.Center.x)-(example.x))*((this.Center.x)-(example.x))+((this.Center.y)-(example.y))*((this.Center.y)-(example.y))<=this.r) {
    
    
			return true;
		}
		return false;
	}
	
}

//接口
interface GraphicOperate {
    
    
	String compareTo(Graphic example);
	boolean pointIsIn(Point example);
}

(5)对(4)题进一步补充:

  • 定义接口:GraphicOperate,用于完成图形对象的操作
  • 成员有:int compareTo(Graphic):比较两个图形的关系(重合、相交、不相交)
  • boolean pointIsIn(Point):判断参数点坐标是否在图形区域中
  • 要求Rect和Circle两个类实现该接口。
  • 编写程序,验证正确性。

已经将代码整合到(4)中

猜你喜欢

转载自blog.csdn.net/weixin_44652589/article/details/114414990