实验四 类的继承
- 实验目的
- 理解抽象类与接口的使用;
- 了解包的作用,掌握包的设计方法。
- 实验要求
- 掌握使用抽象类的方法。
- 掌握使用系统接口的技术和创建自定义接口的方法。
- 了解 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) 利用接口类型的变量可引用实现该接口的类创建的对象。
实验代码一:
package 实验五; abstract class shape{ public abstract double print(); //定义抽象方法 } class Triangle extends shape{ 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 double print(){ if(a+b>c&&a+c>b&&b+c>a){ double p=(a+b+c)/2; return Math.sqrt(p*(p-a)*(p-b)*(p-c)); }else{ System.out.println("无法构成三角形!"); return 0; } } } class Rectangle extends shape{ private double height; private double width; public Rectangle(double height,double width){ this.height=height; this.width=width; } public double print(){ return height*width; } } class yuan extends shape{ private double radius; public yuan(double radius){ this.radius=radius; } public double print(){ return Math.PI*Math.pow(radius, 2); } } public class Text{ public static void main(String[] args){ Triangle Tr=new Triangle(6,9,10); Rectangle Re=new Rectangle(3,5); yuan yu=new yuan(4); System.out.println("三角形的面积:"+Tr.print()); System.out.println("矩形的面积:"+Re.print()); System.out.println("圆的面积:"+yu.print()); } }
实验结果:
实验代码二:
package 实验五加; interface Shape { public abstract void size(); }
package 实验五加; public class Line implements Shape{ 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 x2,double y1,double y2){ this.x1=x1;this.x2=x2;this.y1=y1;this.y2=y2; } public void size(){ System.out.println("直线的长度:"+Math.sqrt((Math.pow(x2-x1, 2))+Math.pow(y2-y1, 2))); } }
package 实验五加; public class Yuan implements Shape{ private double radius; public Yuan(double radius){ this.radius=radius; } public void size(){ if(radius>0){ System.out.println("圆的面积:"+Math.PI*Math.pow(radius, 2)); }else{ System.out.println("无法构成圆"); } } }
package 实验五加; import java.util.Scanner; public class Text{ public static void main(String[] args){ System.out.println("输入圆的半径"); Scanner sc=new Scanner(System.in); double radius=sc.nextDouble(); Yuan s1=new Yuan(radius); s1.size(); System.out.println("输入直线的坐标:"); double x1=sc.nextDouble(); double x2=sc.nextDouble(); double y1=sc.nextDouble(); double y2=sc.nextDouble(); Line s2=new Line(x1,x2,y1,y2); s2.size(); } }
实验结果:
实验总结:这两个题感觉也还好吧,大致的内容和上周的也差不了多少,很多东西都是要用的继承,但继承只能单一继承,而接口可以实现多接口。难度不大,老师上课讲过,书上也有相应的接口例子。
学习总结:
抽象类:
Java中可以创建一种类专门用来当作父类的类叫抽象类。包含一个抽象方法的类必须是抽象类;
抽象类和抽象方法都要使用abstract关键字声明;
抽象方法只需声明不需实现;
抽象类必须被子类继承,子类必须覆写抽象类中的全部抽象方法;
抽象类就是逼普通类多定义了一个抽象方法,除了不能直接进行对象的实例化操作之外并没有什么不同。
接口:
接口可以理解为Java中一种特殊的类;
使用它时必须通过子类,子类通过implements关键字实现接口;
一个子类同时实现两个接口,在子类中就必须同时覆写完两个接口中的全部抽象方法;
一个子类也可以同时继承抽象类和实现接口;
允许一个抽象类实现多个接口,一个接口不允许继承抽象类,允许一个接口继承多个接口。
抽象类与接口的区别:
Object类:
Object是所有类的父类,任何类都默认继承Object。
Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的所有方法。