实验四 类的继承
1.实验目的
- 掌握(继承)类的声明;
- 掌握构造方法执行机理;
- 掌握private、protected、public等修饰符;
- 掌握super的各种用法;
- 掌握重载;
- 掌握重写;
- 基于抽象的编程及上转型的使用;
2. 实验题1
1. 实验内容
定义一个圆类Circle,成员变量:圆心,半径;
成员方法:构造方法、get和set半径的方法、计算面积和周长的方法。
定义圆柱和圆锥类,定义相应的变量成员和成员方法。
使用以上类编程,输出圆柱和圆锥面积和体积。
2.实验思路
3. 代码
- Circle类
package edu.moth10.Circledemos;
public class Circle {
public double r;
public Circle(){
System.out.println("创建了一个圆");
}
public Circle(double r){
this.r =r;
System.out.println("创建了一个圆");
}
public double getR(){
return r;
}
public void setR(double r){
this.r = r;
}
public double getArea(){
double area;
area = Math.PI*r*r;
return area;
}
/**
* 周长是圆的特有属性,故计算周长这个方法不允许被继承
* @return
*/
public final double getAround(){
double around;
around = 2*Math.PI*r;
return around;
}
}
- Circle_Column类
package edu.moth10.Circledemos;
public class Circle_Column extends Circle{
private double h;
public Circle_Column(double h,double r){
/**
*super()用于调用父类的构造方法,在Java中并不是所有的方法
*都会被继承的,例如构造方法,private修饰的方法以及final修
*饰的方法是不能被继承的
*/
super();
this.h = h;
this.r = r;
System.out.println("创建了一个圆柱");
}
public double getH(){
return h;
}
public void setH (double h){
this.h = h;
}
@Override
public double getArea(){
double area;
area = 2*Math.PI*r*r+Math.PI*r*h;
return area;
}
public double getV(){
double V;
V = Math.PI*r*r*h;
return V;
}
}
- Circle_Cone类
package edu.moth10.Circledemos;
public class Circular_Cone extends Circle{
private double h;
public Circular_Cone(double h , double r){
super();
this.h = h;
this.r = r;
System.out.println("创建了一个圆锥");
}
public double getH(){
return h;
}
public void setH (double h){
this.h = h;
}
public double getV(){
double V;
V = Math.PI*r*r*h/3;
return V;
}
@Override
public double getArea(){
double area;
area = Math.PI*r*r+Math.PI*r*Math.hypot(r, h);
return area;
}
}
- Test类
package edu.moth10.Circledemos;
import java.util.Scanner;
public class Test {
public static void main(String argvs[]){
Scanner sc = new Scanner(System.in);
Circle c1 = new Circle();
System.out.println("请输入圆的半径:");
double r = sc.nextDouble();
c1.setR(r);
System.out.println("圆的半径是:"+c1.getR());
System.out.println("圆的面积是:"+c1.getArea());
System.out.println("圆的周长是:"+c1.getAround());
Circle c2 = new Circle(3.0);
System.out.println("圆的半径是:"+c2.getR());
System.out.println("圆的面积是:"+c2.getArea());
System.out.println("圆的周长是:"+c2.getAround());
Circle_Column column = new Circle_Column(2,3);
System.out.println("圆柱的高是:"+column.getH());
System.out.println("圆柱的半径是:"+column.getR());
System.out.println("圆柱的体积是:"+column.getV());
System.out.println("圆柱的表面积是:"+column.getArea());
Circular_Cone cone = new Circular_Cone(2,3);
System.out.println("圆锥的高是:"+cone.getH());
System.out.println("圆锥的半径是:"+cone.getR());
System.out.println("圆锥的表面积是:"+cone.getArea());
System.out.println("圆锥的体积是:"+cone.getV());
}
}
4. 运行结果
3.思考题
1.实验内容2
定义抽象类Shape表示一般二维图形。Shape具有抽象方法area和perimeter
分别计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形、椭圆形等),这些类均为Shape类的子类。完成相关类的定义后,定义含有main方法的类来使用这些类的相应对象,输出相关信息:如对象所代表图形形状、基本数据(半径、长宽高等)以及面积、周长等计算值。
2.实验分析
3. 实验代码
- Shape类
package edu.moth11.Shape;
public abstract class Shape {
public abstract double area();
public abstract double perimeter();
public abstract void getInformation();
}
- Rectangle类
package edu.moth11.Shape;
public class Rectangle extends Shape{
private double length;
private double width;
public Rectangle(double length,double width){
System.out.println("成功创建了一个矩形");
this.length = length;
this.width = width;
}
public void getInformation(){
System.out.println("这个矩形的长为:"+length);
System.out.println("这个举行的宽为:"+width);
}
public double area(){
double areaR;
areaR = length * width;
return areaR;
}
public double perimeter(){
double perimeterR = 0;
perimeterR = 2 * (length + width);
return perimeterR;
}
}
- Triangle类
package edu.moth11.Shape;
import static java.lang.StrictMath.sqrt;
public class Traingle extends Shape{
private double a;
private double b;
private double c;
public Traingle(double a, double b, double c){
System.out.println("成功创建了一个三角形");
this.a = a;
this.b = b;
this.c = c;
}
public void getInformation(){
System.out.println("这个三角形的三条边分别为:"+a+" "+b+" "+c);
}
@Override
public double area(){
double A;
double p = (a + b + c)/2;
double D = p*(p-a)*(p-b)*(p-c);
A = sqrt(D);
return A;
}
@Override
public double perimeter(){
double P;
P = a + b + c;
return P;
}
}
- Circle类
package edu.moth11.Shape;
import java.util.regex.Matcher;
public class Circle extends Shape{
private double r;
public Circle(double r)
{
System.out.println("成功创建了一个圆形");
this.r = r;
}
public void getInformation(){
System.out.println("这个球的半径为"+ r);
}
public double area(){
double A;
A = Math.PI*r*r;
return A;
}
public double perimeter(){
double p;
p = 2*Math.PI*r;
return p;
}
}
- Test类包含main方法
package edu.moth11.Shape;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
printMenu();
Scanner sc = new Scanner(System.in);
int command;
double m,n,k;
while((command = sc.nextInt())>0){
if(command == 1) {
System.out.println("请分别输入矩形的长和宽");
m = sc.nextDouble();
n = sc.nextDouble();
Shape s = new Rectangle(m,n);
s.getInformation();
System.out.println("矩形的面积为"+s.area());
System.out.println("矩形的周长为"+s.perimeter());
}
else if(command == 2) {
System.out.println("请分别输入三角形的三条边长:");
m = sc.nextDouble();
n = sc.nextDouble();
k = sc.nextDouble();
Shape s = new Traingle(m,n,k);
s.getInformation();
System.out.println("三角形的面积为"+s.area());
System.out.println("三角形的周长为"+s.perimeter());
}
else if(command == 3) {
System.out.println("请输入圆的半径:");
m = sc.nextDouble();
Shape s = new Circle(m);
s.getInformation();
System.out.println("圆形的面积为"+s.area());
System.out.println("圆形的周长为"+s.perimeter());
}
else break;
}
}
public static void printMenu(){
System.out.println("请选择您要创建的平面集合类型");
System.out.println("----------------------------");
System.out.println("1. 矩形");
System.out.println("2. 三角形");
System.out.println("3. 圆形");
System.out.println("输入其他数据退出");
}
}
4. 运行结果
4. 实验报告涉及以下内容
- 子类的继承性
- 父类中类方法的继承性
并不是父类中所有的方法都可以继承,例如:private修饰的方法不可以继承,final修饰的方法不可以继承,默认方法不可以继承,构造方法不可以继承。
- super的应用
当用子类的构造方法来创建一个子类对象时,子类的构造方法总是先调用父类的某个构造方法,子类构造方法没有明显的指明是哪个构造方法时,子类就调用父类不带参数的构造方法
子类不继承父类的构造方法,因此子类在器构造方法中需要使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,如果子类中没有明显的用super来调用一个构造方法,则默认子类构造方法中的最开始调用了
super();
- 父类中构造方法的要求
父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误