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

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

实验四 类的继承

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

(一)抽象类的使用

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

2.编程技巧

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

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

(3) 通过父类引用子类对象,通过该引用访问对象方法时实际用的是子类的方法。可将所有对象存入到父类定义的数组中。

实验代码:

package main;

public abstract class Shape {
    private double area;//定义面积

    public double getArea() {
        return area;
    }

    public void setArea(double area) {
        this.area = area;
    }
    public abstract double area();//取得信息,定义抽象方法

}
package main;

public class Circle extends Shape {//子类通过继承抽象类
    private double radius;//定义圆的半径
    
    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }
    public Circle(double radius) {//为属性赋值
        this.radius=radius;
    }

    public double area() {//覆写抽象类中的抽象方法
        return Math.PI*Math.pow(radius, 2);//计算面积
    }

}
package main;

public class Rectangle extends Shape {//子类通过继承抽象类
    private double width,high;//定义矩形宽和高

    public double getWidth() {
        return width;
    }

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

    public double getHigh() {
        return high;
    }

    public void setHigh(double high) {
        this.high = high;
    }
    
    public Rectangle(double width,double high) {//为属性赋值
        this.high=high;
        this.width=width;
    }
    
    public double area() {//覆写抽象类中的抽象方法
        return width*high;//计算面积
    }

}
package main;

public class Triangle extends Shape {//子类通过继承抽象类
    private double a,b,c;//定义三角形三边

    public double getA() {
        return a;
    }

    public void setA(double a) {
        this.a = a;
    }

    public double getB() {
        return b;
    }

    public void setB(double b) {
        this.b = b;
    }

    public double getC() {
        return c;
    }

    public void setC(double c) {
        this.c = c;
    }
    
    public Triangle(double a,double b,double c) {//为属性赋值
        this.a=a;
        this.b=b;
        this.c=c;
    }
    
    public double area() {//覆写抽象类中的抽象方法
        if(a+b>c&&a+c>b&&b+c>a)//判断是否能组成三角形
        {
            double p=(a+b+c)/2;
            return Math.sqrt((p*(p-a)*(p-b)*(p-c)));//计算面积
            
        }
        else return 0;//若不能组成三角形,则输出面积为0
    }
}
package main;

public class test {

    public static void main(String[] args) {
        Shape tr=new Triangle(3,4,5);
        Shape re=new Rectangle(4,5);
        Shape ci=new Circle(4);//实例化子类对象       
        System.out.println("三角形的面积为:"+tr.area());//调用被子类覆写过的方法
        System.out.println("矩形的面积为:"+re.area());
        System.out.println("圆的面积为:"+ci.area()); //输出图形面积
        }
}

实验结果截图:

实验的过程和问题:

做这个问题时,按题目的要求定义了一个抽象类Shape,我建立了多个类,这样感觉思路更加清晰,每个类写的代码都差不多,知道每个图形面积计算的方法就可以覆写抽象类的抽象方法写出来,在计算三角形面积时要判断是否能组成三角形。

(二)使用接口技术

1定义接口Shape,其中包括一个方法size(),设计“直线”、“圆”、类实现Shape接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。

  1. 编程技巧

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

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

实验代码:

package main1;

 interface Shape {             //定义Shape接口
    public void size();     //size()方法
}
  
class Line implements Shape{//子类实现接口
    private double length;//定义直线的长度

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    
     public Line(double length) {     //为属性赋值
         this.length = length;
     }
     public void size() {      // 覆写Shape接口的抽象方法
         System.out.println("直线的长度为:"+this.length);
     }
 }

class Circle implements Shape{//子类实现接口
    private double radius;//定义圆的半径

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }
    public Circle(double radius){ 
           this.radius=radius;          //为属性赋值
       }

    public void size() {//覆写Shape接口的抽象方法
        System.out.println("圆的面积为:"+Math.PI*radius*radius);
        
    }
}
 
public class test {
    public static void main(String[] args){
        Shape li=new Line(6);
        Shape ci=new Circle(5);      //通过子类为接口实例化
        li.size();
        ci.size();           //调用被子类覆写的方法
    }
}

实验结果截图:

实验的结果和问题:

这一题是用接口写的,看了书上的代码感觉接口和抽象类差别不大,还是有点分不清,后来看了书上的对比,又在这道题实践了一下,才发现了一些差别,列如接口只有常量和抽象方法,但二者的优劣势还是看不出来,可能要在更复杂的问题才分的出来。

学习课程总结

抽象类与接口的关系

序号

区别点

抽象类

接口

1

定义

包含一个抽象方法的类

抽象方法和全局常量的集合、

2

组成

构造方法、抽象方法、普通方法、常量、变量

常量、抽象方法

3

使用

子类继承抽象类

子类实现接口

4

关系

抽象类可以实现多个接口

接口不能继承抽象类,但允许继承多个接口

5

常见设计模式

模板设计

工厂设计、代理设计

6

对象

都通过对象的多态性产生实例化对象

 

7

局限

抽象类有单继承的局限

接口没有单继承的局限

8

实际

作为一个模板

是作为一个标准或是表示一种能力

9

选择

如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限

 

10

特殊

一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类

 

异常:

try{
被检测的代码
可能出现异常的代码
 }catch(异常类名 变量){
异常的处理方式
循环,判断,调用方法,变量


 }finally{
必须要执行的代码
 }

异常中的关键字:throw 在方法的内部,抛出异常对象,throws用于方法的声明上,表名此方法可能出现异常请调用者处理,throws 后面必须写异常类的类名,

学习总结:本周学习的主要是接口和抽象类,现在可以用他们写程序,但是除了字符上还是没有找到它们明显的区别,可能以后在写代码过程中会更加理解它们的不同,但其实用抽象类和接口写代码还是挺方便的,感觉还不错。



 

原文地址:https://www.cnblogs.com/198266qq/p/11656622.html