第七周课程总结&实验报告(五)
- 实验目的
- 理解抽象类与接口的使用;
- 了解包的作用,掌握包的设计方法。
- 实验要求
- 掌握使用抽象类的方法。
- 掌握使用系统接口的技术和创建自定义接口的方法。
- 了解 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 实验五; public abstract class Shape { private double a,b,c; public Shape(double a,double b,double c) { this.a=a; this.b=b; this.c=c; } public Shape(double a,double b) { this.a=a; this.b=b; } public Shape(double a) { this.a = a; } public abstract void print(); 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 class Triangle extends Shape{ public Triangle(double a,double b,double c) { super(a,b,c); } public double Area() { double p=(getA()+getB()+getC())/2; double s=Math.sqrt(p*(p-getA())*(p-getB())*(p-getC())); return s; } public void print(){ System.out.println("三角形面积:"+this.Area()); } public class Rectangle extends Shape{ public Rectangle(double a,double b) { super(a,b); } public double Area() { double z = getA()*getB(); return z; } public void print(){ System.out.println("矩形面积:"+this.Area()); } public class Circle extends Shape{ public Circle(double a) { super(a); } public double Area() { double x=3.14*getA()*getA(); return x; } public void print(){ System.out.println("圆的面积:"+this.Area()); } import java.util.*; public class Test { public static void main(String[] args) { System.out.println("请输入三角形三边长:"); Scanner out = new Scanner(System.in); int a = out.nextInt(); int b = out.nextInt(); int c = out.nextInt(); System.out.println("请输入圆的半径:"); int d = out.nextInt(); System.out.println("请输入矩形的宽和高:"); int e = out.nextInt(); int f = out.nextInt(); Triangle tr = new Triangle(a,b,c); tr.print(); Circle cir = new Circle(d); cir.print(); Rectangle rec = new Rectangle(e,f); rec.print(); } }
实验结果
二、实验代码
package jiekou; public interface Shape { public void size(); } public class Shape1{ public static Shape getshape(String className,double a) { Shape s = null; if("Circle".equals(className)) { s = new Circle(a); } if("Line".equals(className)) { s = new Line(a); } return s; } } public class Circle implements Shape{ private double a; public Circle(double a) { this.a = a; } public double getA() { return a; } public void setA(double a) { this.a = a; } public void size() { System.out.println("圆的半径:"+a+" 圆的面积:"+(3.14*a*a)); } } public class Line implements Shape{ private double a; public Line(double a) { this.a = a; } public double getA() { return a; } public void setA(double a) { this.a = a; } public void size() { System.out.println("直线的长度:"+a); } } import java.util.Scanner; public class Test { public static void main(String[] args) { while(true) { System.out.print("\n"+"请输入图形:"); Scanner out =new Scanner(System.in); String str = out.nextLine(); System.out.print("请输入数据:"); int p = out.nextInt(); Shape s = null; s = Shape1.getshape(str,p); } } }
结果
学习总结
本周老师讲了抽象类与接口之间的关系
区别点 | 抽象类 | 接口 |
定义 | 包含一个抽象方法的类 | 抽象方法和全局常量的集合 |
组成 | 构造方法、抽象方法、普通方法、常量、变量 | 常量、抽象方法 |
使用 | 子类继承抽象类(extends) | 子类实现接口(implements) |
关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,但允许继承多个接口 |
常见设计模式 | 模板设计 | 工厂设计、代理设计 |
局限 | 抽象类有单继承的局限 | 接口没有继承的局限 |
实际 | 作为一个模板 | 是作为一个标准或是标是一种能力 |
对象:都通过对象的多态性产生实例化对象;选择:如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限;特殊:一个抽象类中可以包含多个接口,一个接口中包含多个抽象类;
还讲了object类是所有类的老祖宗;以及异常的捕获和处理;