第七周课程总结&实验报告(五)
实验四 类的继承
- 实验目的
- 理解抽象类与接口的使用;
- 了解包的作用,掌握包的设计方法。
- 实验要求
- 掌握使用抽象类的方法。
- 掌握使用系统接口的技术和创建自定义接口的方法。
- 了解 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