实验四 类的继承

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

 

  • 实验内容

(一)抽象类的使用

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

2.编程技巧

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

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

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

实验代码:

 

abstract class Mianji {
   
    public abstract double area() ;
   
   
}

 

class Tangle extends Mianji {
    double a;
     double b;
     double c;
     double p;
     public Tangle(double a,double b,double c) {
         this.a=a;this.b=b;this.c=c;
     }
    
    
    public double area() {
        double p=(a+b+c)/2;
        return Math.sqrt(p*(p-a)*(p-b)*(p-c));
    }
   
}
 
class Yuan extends Mianji  {
     double r;
 
     public Yuan(double r) {
         this.r=r;
       
     }
    public double area() {
       
          return  Math.PI*r*r;
    }
   
 }
 
public class Rectangle{
     double width,height;
     public Rectangle (double w,double h){
         width=w;
         height=h;
     }
     public double arae() {
         return width*height;
     }
    
 }
 
public class TEST {
    public static void main(String[] args) {
        Mianji m1=new Tangle(2,3,4);
        Mianji m2=new Yuan(5);
        Rectangle m3=new Rectangle(6,7);
     System.out.println(m1.area());
     System.out.println(m2.area());
     System.out.println(m3.arae());
    }
}
截图:

 

(二)使用接口技术

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

  1. 编程技巧

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

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

实验代码:

package shyfive;

interface Shape{
    public void size();
}

 

class Circle implements Shape{
    private double radius;
   
     public Circle(double radius) {
        this.radius=radius;
    }
    public double getRadius() {
        return radius;
    }
    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        double area=Math.pow(radius,2)*3.14;
        return area;
    }
    public void size() {
        System.out.println("圆的大小:"+getArea());
    }
}
   
class Segment implements Shape{
    private double length;
   
    public Segment(double length) {
        this.length=length;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    public double getHigh() {
        double high=length;
        return high;
    }
    public void size() {
        System.out.println("直线长度:"+getHigh());
    }
}

 

 

public class Demo5 { public static void main(String[] args) {
        Shape str1=new Circle(5); Shape str2=new Segment(9);
        str1.size();
        str2.size();
    }

}

截图:

 

课程总结:

抽象:

(1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法

(2) 抽象类不能被实例化

(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类

(4) 具体派生类必须覆盖基类的抽象方法

(5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们

接口:

(1) 接口不能被实例化

(2) 接口只能包含方法声明

(3) 接口的成员包括方法、属性、索引器、事件

(4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员

接口和抽象类的区别:

(1)抽象类可以有构造方法,接口中不能有构造方法。

(2)抽象类中可以有普通成员变量,接口中没有普通成员变量

(3)抽象类中可以包含静态方法,接口中不能包含静态方法

(4) 一个类可以实现多个接口,但只能继承一个抽象类。

(5)接口可以被多重实现,抽象类只能被单一继承

(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

 接口和抽象类的相同点:

(1) 都可以被继承

(2) 都不能被实例化

(3) 都可以包含方法声明

(4) 派生类必须实现未实实现的方法

 
posted on 2019-10-11 20:58  吃饭要吃饱  阅读(198)  评论(1编辑  收藏  举报