实验报告(五)
一.实验目的
1.理解抽象类与接口的使用;
2.了解包的作用,掌握包的设计方法。
二.实验要求
1.掌握使用抽象类的方法。
2.掌握使用系统接口的技术和创建自定义接口的方法。
3.了解 Java 系统包的结构。
4.掌握创建自定义包的方法。
三.实验内容
1.抽象类的使用
设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。 继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。
注:三角形面积s=sqrt(p(p-a)(p-b)*(p-c)) 其中,a,b,c为三条边,p=(a+b+c)/2
编译技巧:
- 抽象类定义的方法在具体类要实现;
- 使用抽象类的引用变量可引用子类的对象;
- 通过父类引用子类对象,通过该引用访问对象方法时实际用的是子类的方法。可将所有对象存入到父类定义的数组中。
(1)实验代码:
抽象类以及三角型、矩形、圆的对象
package 测试;
public abstract class Shape {
public abstract double getArea();
}
class Triangle extends Shape{
private double a,b,c;
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
public double getArea() {
double p=(a+b+c)/2;
double area=Math.sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}
}
class Rectangle extends Shape{
private double a,b;
public Rectangle(double a, double b) {
this.a = a;
this.b = b;
}
public double getArea() {
double area=a*b;
return area;
}
}
class Circle extends Shape{
private double r;
public Circle(double r) {
this.r = r;
}
public double getArea() {
double area=Math.PI*r*r;
return area;
}
}
实验运行
package 测试;
import java.util.Scanner;
public class 测试0 {
public static void main(String[] args) {
Scanner num=new Scanner(System.in);
System.out.println("请输入三角形的的边长:");
double a=num.nextDouble();
double b=num.nextDouble();
double c=num.nextDouble();
Shape triangle=new Triangle(a,b,c);
System.out.println("三角形的面积为:"+triangle.getArea());
System.out.println("");
System.out.println("请输入矩形的长和宽:");
double a1=num.nextDouble();
double b1=num.nextDouble();
Shape rectangle=new Rectangle(a1,b1);
System.out.println("矩形的面积为:"+rectangle.getArea());
System.out.println("");
System.out.println("请输入圆的半径:");
double r=num.nextDouble();
Shape circle=new Circle(r);
System.out.println("圆的面积为:"+circle.getArea());
}
}
(2)实验运行结果截图:
(3)实验大致思路:
定义抽象类Shape,在其中定义获取形状的面积的抽象方法getArea();,然后分别定义三角形,矩形,圆形的对象,最后输出它们的数据并将它们的面积输出
(4)实验中遇到的问题:
题目不复杂,就是一开始编写的时候想放在一个文件里,它显示Shape抽象类必须在自己的文件中定义,新建一个文件就没问题了.
2.使用接口技术
定义接口Shape,其中包括一个方法size(),设计“直线”、“圆”、类实现Shape接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。
编程技巧:
- 接口中定义的方法在实现接口的具体类中要重写实现;
- 利用接口类型的变量可引用实现该接口的类创建的对象。
(1)实验代码:
接口以及直线、圆的对象
package 测试;
public interface Shape {
public void size();
}
class Line implements Shape{
private double lenght;
public Line(double lenght) {
this.lenght = lenght;
}
public void size() {
System.out.println("直线的长度为:"+lenght);
}
}
class Circle implements Shape{
private double r;
public Circle(double r) {
this.r = r;
}
public void size() {
double lenght=2*r*Math.PI;
double area=Math.PI*r*r;
System.out.println("圆的半径为:"+r);
System.out.println("圆的周长为:"+lenght);
System.out.println("圆的的面积长度为:"+area);
}
}
实验运行
package 测试;
import java.util.Scanner;
public class 测试0 {
public static void main(String[] args) {
Scanner num=new Scanner(System.in);
System.out.println("请输入直线的长度:");
double lenght=num.nextDouble();
Shape line=new Line(lenght);
line.size();
System.out.println("请输入圆的半径:");
double r=num.nextDouble();
Shape circle=new Circle(r);
circle.size();
}
}
(2)实验运行结果截图:
(3)实验大致思路:
定义接口Shape,其中包括一个方法size();,然后定义直线还有圆的对象,输入它们的数据,并将直线的长度,圆的半径,周长,面积输出.
(4)实验中遇到的问题:
接口和抽象类还是很相像的,这2道题的思路基本一致,所以做起来很容易,没有出现什么问题
第七周课程总结
这周主要讲了抽象类与接口的运用,还有Object类的定义和基本方法
这周学习的内容:
1.抽象类与接口之间的关系
序号 | 区别点 | 抽象类 | 接口 |
---|---|---|---|
1 | 定义 | 包含一个抽象方法的类 | 抽象方法和全局常量的集合 |
2 | 组成 | 构造方法、抽象方法、普通方法、常量、变量 | 常量、抽象方法 |
3 | 使用 | 子类继承抽象类(extends) | 子类实现接口(implements) |
4 | 关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,但允许继承多个接口 |
5 | 常见设计模式 | 模板设计 | 工厂设计、代理设计 |
6 | 对象 | 都通过对象的多态性产生实例化对象 | |
7 | 局限 | 抽象类有单继承的局限 | 接口没有此局限 |
8 | 实际 | 作为一个模板 | 是作为一个标准或是表示一种能力 |
9 | 选择 | 如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限 | |
10 | 特殊 | 一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类 |
2.Object类
在Java中所有的类都有一个公共的父类就是Object类,一个类只要没有明显的继承一个类,则肯定是Object类的子类。如下两种代码表示的含义都是一样的:
class Person extends Object{}
class Person{}
Object类中的主要方法
序号 | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public Object() | 构造 | 构造方法 |
2 | public boolean equals(Object obj) | 普通 | 对象比较 |
3 | public int hashCode() | 普通 | 取得Hash码 |
4 | public String toString() | 普通 | 对象打印时调用 |