第七周课程总结&实验报告(五)
一.抽象类的使用
设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。 继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。
注:三角形面积s=sqrt(p(p-a)(p-b)*(p-c)) 其中,a,b,c为三条边,p=(a+b+c)/2
2.编程技巧
(1) 抽象类定义的方法在具体类要实现;
(2) 使用抽象类的引用变量可引用子类的对象;
(3) 通过父类引用子类对象,通过该引用访问对象方法时实际用的是子类的方法。可将所有对象存入到父类定义的数组中。
(二)使用接口技术
定义接口Shape,其中包括一个方法size(),设计“直线”、“圆”、类实现Shape接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。
编程技巧
(1) 接口中定义的方法在实现接口的具体类中要重写实现;
(2) 利用接口类型的变量可引用实现该接口的类创建的对象。
实验代码
package test; import java.util.Scanner; abstract class Hope{ //定义一个抽象类 public abstract double Area(); //求面积的抽象方法 } class Triangle extends Hope{ //三角形继承Hope private double a; private double b; private double c; public Triangle(double a,double b,double c) { //构造三角形的三条边 this.a=a; this.b=b; this.c=c; } public void setA(double a) { this.a=a; } public double getA(){ return a; } public void setB(double b) { this.b=b; } public double getB() { return b; } public void setC(double c) { this.c=c; } public double getC() { return c; } public double Area() { //计算三角形的面积 double p=(a+b+c)/2; return Math.sqrt(p*(p-this.a)*(p-this.b)*(p-this.c)); } } class Rectangle extends Hope{ //矩形继承Hope private double width; private double hight; public Rectangle(double width,double hight) { //构造矩形的宽高 this.width=width; this.hight=hight; } public void setWidth(double width) { this.width=width; } public double getWidth() { return width; } public void setHigth(double hight) { this.hight=hight; } public double getHight() { return hight; } public double Area() { //计算矩形的面积 return this.width*this.hight; } } class Circle extends Hope{ //圆继承Hope private double r; public Circle(double r) { //构造圆的半径 this.r=r; } public void setR(double r) { this.r=r; } public double getR() { return r; } public double Area() { //计算圆的面积 return Math.PI*this.r*this.r; } } public class Test { public static void main(String[] args) { System.out.println("请输入三角形三边:"); Scanner s=new Scanner(System.in); double a=s.nextDouble(); //读取输入内容 double b=s.nextDouble(); double c=s.nextDouble(); Triangle triangle=new Triangle(a,b,c); //调用类输出 if((a+b)>c&&(a+c)>b&&(b+c)>a) { System.out.println("三角形的面积为:"+triangle.Area()); }else { System.out.println("这不是一个三角形请重新输入"); return; } System.out.println("请输入矩形的宽高:"); Scanner s1=new Scanner(System.in); double width=s1.nextDouble(); //同上 double hight=s1.nextDouble(); Rectangle rectangle=new Rectangle(width,hight); //同上 System.out.println("矩形的面积为:"+rectangle.Area()); System.out.println("请输入圆的半径:"); Scanner s2=new Scanner(System.in); double r=s2.nextDouble(); //读取输入内容 Circle circle=new Circle(r); //同上 if(r<0) { System.out.println("这不是一个圆请重新输入"); } else { System.out.println("圆的面积为:"+circle.Area()); } } }
实验截图
(二)使用接口技术
定义接口Shape,其中包括一个方法size(),设计“直线”、“圆”、类实现Shape接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。
实验代码
interface shape { public void size(); } class Cricle implements shape { public double redius; public Cricle(double redius) { this.redius = redius; } public double getRedius() { return redius; } public void setRedius(double redius) { this.redius = redius; } public double SSS() { double s = Math.pow(redius, 2) * 3.14; return s; } public void size() { System.out.println("圆的大小为" + SSS()); } } class zhixian implements shape { public double h; public zhixian(double h) { this.h = h; } public double getH() { return h; } public void setH(double h) { this.h = h; } public double S() { double s = h; return s; } public void size() { System.out.println("直线的大小为" + S()); } } public class test { public static void main(String[] args) { shape str1 = new Cricle(10); shape str2 = new zhixian(10); str1.size(); str2.size(); } }
实验截图
课程总结
1.抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2.抽象类要被子类继承,接口要被类实现。
3.接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5.抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6.抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7.抽象类里可以没有抽象方法
8.如果一个类里有抽象方法,那么这个类只能是抽象类
9.抽象方法要被实现,所以不能是静态的,也不能是私有的。
10.接口可继承接口,并可多继承接口,但类只能单根继承。
区别点 | 抽象类 | j接口 |
定义 | 包含一个抽象方法的类 | 抽象方法和全局变量 |
组成 | 构造方法,抽象方法普通方法,常量,变量 | 常量,抽象方法 |
使用 | 子类继承抽象类 | 子类实现接口 |
关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,但可以继承多个接口 |
常见设计模式 | 模板设计 | 工厂设计,代理设计 |
对象 | 都通过对象的多态性产生实例化 | |
局限 | 抽象类有单继承的局限 | 接口没有单继承的局限 |
实际 | 作为一个模板 | 是作为一个标准或是表达一种能力 |
选择 | 如果抽象类和接口都可以使用,有限使用接口,避免单继承的局限 | |
特殊 | 一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类 |