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

实验四 类的继承

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

 

  • 实验内容

(一)抽象类的使用

1、设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。 继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。
(:三角形面积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接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。

2、编程技巧

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

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

1-1、实验代码

public abstract class shape {
    
    
    public String shape;
    public double area;
    
    public String getShape() {
        return shape;
    }

    public void setShape(String shape) {
        this.shape = shape;
    }

    public double getArea() {
        return area;
    }

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

    public void shape()
    {
        if(this.area() != 0)
            System.out.println(this.shape+"的面积为:"+this.area());
        else
            System.out.println("无法计算");
    }
    
    public abstract double area();
}

1-2、实验代码

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 (String shape ,double a, double b, double c ) {     //赋值
        this.shape = shape;
        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)*0.5;
            double q = (p*(p-a)*(p-b)*(p-c));
        
            return Math.sqrt(q);
            
        }
        else
        {
            System.out.println("这不是三角形,请重新输入!!!");
        }
        return 0;
    }
}

1-3、实验代码

public class rectangle extends shape {

    
    private double High ,Width;    // //定义自己的变量
    
    public double getHigh() {
        return High;
    }

    public void setHigh(double high) {
        High = high;
    }

    public double getWidth() {
        return Width;
    }

    public void setWidth(double width) {
        Width = width;
    }
    public rectangle (String shape ,double High, double Width ) {     //赋值
        this.shape = shape;
        this.High = High;
        this.Width = Width;
    }
    public double area() {     //覆写
        if(High >= 0 && Width >=0)  //判断是否为矩形
        {
            double s = 2*(Width+High);
            return s;
        }
        else 
        {
            System.out.println("这不是矩形,请重新输入!!!");
        }
            
        return 0;
    }

}

1-4、实验代码

public class circle extends shape {

    private double r;    //定义自己的变量
    
    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }
    
    public circle (String shape ,double r) {    //赋值
        this.shape = shape;
        this.r = r;
    }
    public double area() {      //覆写
        if(r >= 0)    //判断是否为圆
        {
            double S = Math.PI * Math.pow(r, 2);
            
            return S;
        }
        else 
        {
            System.out.println("这不是圆,请重新输入!!!");
        }
        return 0;
    }

}

1-5、实验代码

public class text {

    public static void main(String[] args) {
        shape s1= new triangle("三角形",3,4,5);
        shape s2= new rectangle("矩形",1,1);
        shape s3 =new circle("圆",2);
        
        s1.shape();
        s2.shape();
        s3.shape();
    }

}

1-2、运行结果截图

本题小结:这个题目总体上来说不是特别难,注意一些细节还是可以写完。

2-1、实验代码

import java.util.Scanner;

public interface shape1 
{
     public void longing();
}

2-2、实验代码

import java.util.Scanner;
class line implements shape1{
    
    private double x1,x2,y1,y2;  //定义直线两端坐标

    
    public double getX1() {
        return x1;
    }

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

    public double getX2() {
        return x2;
    }

    public void setX2(double x2) {
        this.x2 = x2;
    }

    public double getY1() {
        return y1;
    }

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

    public double getY2() {
        return y2;
    }

    public void setY2(double y2) {
        this.y2 = y2;
    }
    
    public line(double x1,double y1,double x2,double y2) {   //赋值
        this.x1=x1;
        this.x2=x2;
        this.y1=x2;
        this.y2=y2;
    }

    public void longing() {
        
        double S = Math.pow(x1, x2) + Math.pow(y1, y2);
        
        System.out.println("直线的长度为:"+ S);
        
    }
    
}

2-3、实验代码

import java.util.Scanner;
//System.out.println("直线的长度为:"+ Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2)));
class circle1 implements shape1{
    
    private double r;
    
    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }
    public circle1(double r) {   //赋值
        
        this.r = r;
        
    }

    public void longing() {
        if(r >= 0)  //判断是否为圆
        {
            double p = Math.PI*Math.pow(r, 2);
            System.out.println("圆的面积为:"+ p);
        }
        else 
        {
            System.out.println("这不是圆,请重新输入!!!");
        }
    }
}

2-4、实验代码

import java.util.Scanner;

public class text1 {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入圆的半径:");
        double r=sc.nextDouble();
        circle1 p1=new circle1(r);    //实例化对象
        
        p1.longing();
        
        System.out.println("请输入直线两端段点坐标:");
        double x1=sc.nextDouble();
        double y1=sc.nextDouble();
        double x2=sc.nextDouble();
        double y2=sc.nextDouble();
        
        line p2=new line(x1,y1,x2,y2);
        p2.longing();
    }
    }

2-2、运行结果截图

本题小结:这个题目写出来后发现没有输出,全部用return 返回了,后来就改成了用输出;

总结:这次的题目总体来说难度一般,不过这次我又忘记了打double x1=sc.nextDouble();来输入,结果导致我在主函数那里卡了很久,以后要记住这种方法。

 

第七周课程总结

1、抽象类与接口的关系

 

 2、Object类

 

 3、接口的使用方法

1) 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口。

2 )接口里面的成员变量默认都是public static final类型的。必须被显示的初始化。

3 )接口里面的方法默认都是public abstract类型的。隐式声明。

4 )接口没有构造方法,不能被实例化。

5 )接口不能实现另一个接口,但可以继承多个接口。

6 )类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类。

 4、抽象类的使用方法

1 如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。

2  抽象方法必须存在于抽象类中。

3  抽象类中可以有一般的变量和一般的方法。

4 子类继承抽象类必须实现其中抽象方法,除非子类为抽象类。 
  

    private void print(){};//此语句表示方法的空实现。 
    abstract void print(); //此语句表示方法的抽象,无实现。

5、接口和抽象类的区别

1 )接口只能包含抽象方法,抽象类可以包含普通方法。 
2 )接口只能定义静态常量属性,抽象类既可以定义普通属性,也可以定义静态常量属性。 
3 )接口不包含构造方法,抽象类里可以包含构造方法。    

4)抽象类不能被实例化,但不代表它不可以有构造函数,抽象类可以有构造函数,备继承类扩充

5) 接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。 
6) 如果许多类实现了某个接口,那么每个都要用代码实现那些方法 
7)如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。

所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。

欲知更详细内容请参考:https://www.jb51.net/article/76738.htm

posted @ 2019-10-11 18:54  ღ阿ོ茶꧔ꦿ༊  阅读(224)  评论(0编辑  收藏  举报