首页 > 其他 > 详细

第七周课程总结&实验报告(五)

时间:2019-10-12 20:12:48      阅读:78      评论:0      收藏:0      [点我收藏+]

实验报告

实验目的
理解抽象类与接口的使用;
了解包的作用,掌握包的设计方法。
实验要求
掌握使用抽象类的方法。
掌握使用系统接口的技术和创建自定义接口的方法。
了解 Java 系统包的结构。
掌握创建自定义包的方法。

实验内容
(一)抽象类的使用
设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。 继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。
注:三角形面积s=sqrt(p(p-a)(p-b)*(p-c)) 其中,a,b,c为三条边,p=(a+b+c)/2
2.编程技巧

(1) 抽象类定义的方法在具体类要实现;

(2) 使用抽象类的引用变量可引用子类的对象;

(3) 通过父类引用子类对象,通过该引用访问对象方法时实际用的是子类的方法。可将所有对象存入到父类定义的数组中。
(二)使用接口技术
1定义接口Shape,其中包括一个方法size(),设计“直线”、“圆”、类实现Shape接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。
编程技巧

(1) 接口中定义的方法在实现接口的具体类中要重写实现;

(2) 利用接口类型的变量可引用实现该接口的类创建的对象。

抽象类的使用

代码

抽象类
package abstractclass;

public abstract class Shape {

    private String shapename;
    
    public String getShapename() {
        return shapename;
    }

    public void setShapename(String shapename) {
        this.shapename = shapename;
    }

    public Shape() {
    }
        
    public Shape(String shapename) {
        this.shapename = shapename;
    }
    
    public void printArea() {
        System.out.println(this.getshapeArea());
    }
    
    public abstract String getshapeArea();
    
}
三角形
package abstractclass;
public class Triangle extends Shape {

    private float lengtha;
    private float lengthb;
    private float lengthc;
    private float p;
    private double area;
    
    public float getLengtha() {
        return lengtha;
    }

    public void setLengtha(float lengtha) {
        this.lengtha = lengtha;
    }

    public float getLengthb() {
        return lengthb;
    }

    public void setLengthb(float lengthb) {
        this.lengthb = lengthb;
    }
    
    public float getLengthc() {
        return lengthc;
    }


    public void setLengthc(float lengthc) {
        this.lengthc = lengthc;
    }


    public float getP() {
        return p;
    }

    public void setP(float p) {
        this.p = p;
    }
    
    public double getArea() {
        return area;
    }

    public void setArea(double area) {
        this.area = area;
    }


    public Triangle(String shapename,float lengtha,float lengthb,float lengthc) {
        super(shapename);
        this.lengtha = lengtha;
        this.lengthb = lengthb;
        this.lengthc = lengthc;
    }


    public String getshapeArea() {
        
        if(this.lengtha !=0 && this.lengthb != 0 && lengthc !=0)
        {
            this.p = (this.lengtha + this.lengthb + this.lengthc)/2;
            this.area = Math.sqrt(p*(p-lengtha)*(p-lengthb)*(p-lengthc));
            
            if(this.area == 0)
            {
                return "边长值不合法";
            }
            else 
                return super.getShapename()+"的面积是:"+this.area;
        }
        return super.getShapename()+"的面积是:"+ 0;
    }
}
矩形
package abstractclass;
public class Rectangle extends Shape {

    private float width;
    private float heigth;
    private double area;
    
    public float getWidth() {
        return width;
    }

    public void setWidth(float width) {
        this.width = width;
    }

    public float getHeigth() {
        return heigth;
    }

    public void setHeigth(float heigth) {
        this.heigth = heigth;
    }

    public double getArea() {
        return area;
    }

    public void setArea(double area) {
        this.area = area;
    }

    public Rectangle(String shapename,float heigth,float width) {
        super(shapename);
        this.heigth = heigth;
        this.width = width;
    }

    @Override
    public String getshapeArea() {
        
        if(this.width < 0 || this.heigth < 0)
            return "边长值不能为负";
        
        this.area = this.width * this.heigth;
        
        return super.getShapename()+"的面积是:"+this.area;
    }

}
圆形
package abstractclass;
public class Circle extends Shape {

    private float radius;
    private double area;

    public float getRadius() {
        return radius;
    }
    public void setRadius(float radius) {
        this.radius = radius;
    }
    
    public double getArea() {
        return area;
    }
    
    public void setArea(double area) {
        this.area = area;
    }

    public Circle(String shapename,float radius) {
        super(shapename);
        this.radius = radius;
    }

    @Override
    public String getshapeArea() {
        
        if(this.radius < 0)
            return "半径值不能为负";
        
        this.area = Math.PI * Math.pow(radius, 2);
        
        return super.getShapename()+"的面积是:"+this.area;
    }

}
测试
package abstractclass;

public class test {
    
    public static void main(String args[]) {
        Shape shape1 = new Triangle("三角形",3,4,5);
        Shape shape2 = new Rectangle("矩形",5,4);
        Shape shape3 = new Circle("圆形",3);
        
        shape1.printArea();
        shape2.printArea();
        shape3.printArea();
    }

}

遇到的问题

1.输出三角形面积的值不正确;
技术分享图片
解决办法:在计算p的值时没有除以2。

运行结果

技术分享图片

技术分享图片

技术分享图片

使用接口技术

代码

接口
package interfaceclass;

public interface Shape {
    public void size();
}
方法
package interfaceclass;

public class Methods {

    public static void figure(Shape shape) {
        shape.size();
    }
}
直线
package interfaceclass;

public class Beeline implements Shape {

    private float x1;
    private float x2;
    private float y1;
    private float y2;
    
    
    public float getX1() {
        return x1;
    }

    public void setX1(float x1) {
        this.x1 = x1;
    }

    public float getX2() {
        return x2;
    }
    
    public void setX2(float x2) {
        this.x2 = x2;
    }

    public float getY1() {
        return y1;
    }

    public void setY1(float y1) {
        this.y1 = y1;
    }

    public float getY2() {
        return y2;
    }
    
    public void setY2(float y2) {
        this.y2 = y2;
    }

    public Beeline(float x1,float y1,float x2,float y2) {
        this.x1 = x1;
        this.x2 = x2;
        this.y1 = y1;
        this.y2 = y2;
    }
    
    @Override
    public void size() {
        
        System.out.println("直线长为:"+ Math.sqrt(Math.pow(this.x1-this.x2,2)+Math.pow(this.y1-this.y2, 2)));
    }

}
圆类
package interfaceclass;

public class Circle implements Shape {

    private float radius;
    
    public float getRadius() {
        return radius;
    }
    
    public void setRadius(float radius) {
        this.radius = radius;
    }

    public Circle(float radius) {
        this.radius = radius;
    }
    
    @Override
    public void size() {
        
        System.out.println("圆形面积是:"+ Math.PI * Math.pow(this.radius,2));
    }
}
测试
package interfaceclass;

public class test {

    public static void main(String args[]) {
        Methods.figure(new Beeline(2,2,4,4));   //先输入第一个坐标的横、纵坐标再输第二个;
        Methods.figure(new Circle(4)); 
    }
}

遇到的问题

一开始不理解编程技巧中的第2条是什么意思,用的方法和上面抽象类一样;
解决办法:看了书上的例题才知道是什么意思,然后改成了现在的版本。

运行结果

技术分享图片

学习总结

抽象类与接口的应用

1.抽象类是在对象们有共同特性,也有不同时使用;共同属性在抽象类中赋值,不同点则创建抽象方法,在子类继承之后具体实现。
接口更多用于制定标准;接口中只有抽象方法,由子类实现接口之后具体实现,还要创建一个作用类似于“中转站”的类,在其中用前面创建的接口的类型的变量来应用具体的方法。
2.抽象类和接口都可以使用的话,优先使用接口,接口没有单继承的局限;

Object类

Object类主要讲了两个方法
toString():输出对象时调用该方法打印内容。
equals():Object类中的equals()方法默认是比较地址,返回值时boolean型,要比较内容的话,要在子类覆写。
一开始我其实很疑惑,此前我们学过的String类的equals()方法不是比较内容的吗?去网上查了后知道在Object类的equals方法的本质其实是和“==”一样的,都是比较两个对象引用是否指向同一个对象(即两个对象是否为同一对象)。String类继承Object类后,也继承了equals方法,但String类对equals方法进行了重写,改变了equals方法的比较形式。

第七周课程总结&实验报告(五)

原文:https://www.cnblogs.com/LeeMayZ/p/11649536.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!