(一)定义一个抽象的形状类Shape
为什么要定义为抽象类?
因为要计算的形状面积各不相同,方法体是不确定的,所以方法定义为抽象方法,抽象方法所在的类必须为抽象类(而抽象类不一定有抽象方法)。
返回值类型也可以定义为其他的数据类型
public abstract class Shape {
public abstract double CalculateArea();
}
(二)定义Shape的子类,即各种图形
(1)定义矩形
步骤:
1.继承形状类Shape
2.此时会显示报错,因为需要重写父类的抽象方法
CalculateArea()
@Override下面的代码代表重写
1.定义成员变量—>矩形的参数,长和宽
2.创建空参构造和全参构造
完整代码:
public class Rectangle extends Shape {
//参数
int width;
int length;
//空参构造
public Rectangle() {
}
//全参构造
public Rectangle(int width, int length) {
this.width = width;
this.length = length;
}
//重写方法
@Override
public double CalculateArea() {
System.out.println("该矩形的面积是:"+width*length);
return width*length;
}
}
(2)定义平行四边形
步骤和矩形类的步骤大同小异,只需要将对应的变量修改即可
完整代码:
public class Parallelogram extends Shape {
//参数
int height;
int base;
//空参构造
public Parallelogram() {
}
//全参构造
public Parallelogram(int height, int base) {
this.height = height;
this.base = base;
}
//重写方法
@Override
public double CalculateArea() {
System.out.println("该平行四边形的面积是:"+height*base);
return height*base;
}
}
(3)定义圆形
注意参数pi不需要写在有参构造的参数里,只需要有半径就可以了。
完整代码:
public class Circle extends Shape {
//参数
int r;
double pi=3.1415926;
//空参构造
public Circle() {
}
//有参构造
public Circle(int r) {
this.r = r;
}
//重写方法
@Override
public double CalculateArea() {
System.out.println("该圆形的面积是:"+pi*r*r);
return pi*r*r;
}
}
(4)定义三角形
完整代码:
public class Triangle extends Shape {
//参数
int base;
int height;
//空参构造
public Triangle() {
}
//全参构造
public Triangle(int base, int height) {
this.base = base;
this.height = height;
}
//重写方法
@Override
public double CalculateArea() {
System.out.println("该三角形的面积是:"+base*height*0.5);
return base*height*0.5;
}
}
(三)定义一个计算类Operation
定义一个计算类,类里面定义一个计算方法
注意:参数写为所有图形的父类Shape,这样不论传什么类型的图形变量都能够被接收,构成多态。
方法体里调用Shape类的计算面积方法
完整代码:
public class Operation {
public void operate(Shape shape ){
shape.CalculateArea();
}
}
(四)定义一个测试类测试
注意此处调用方法的写法:
更为详细的步骤:以矩形为例
首先new一个Rectangle类型的对象,赋值给左边Shape类型(父类)的变量s
然后调用operate方法,参数写s
//调用方法
//矩形
Shape s=new Rectangle(5,6);
o.operate(s);
简易的写法:省去赋值的过程,new出来的对象直接作为参数。
//调用方法
//矩形
o.operate(new Rectangle(5,6));
完整代码:
public class test {
public static void main(String[] args) {
//创建一个计算器
Operation o=new Operation();
//调用方法
//矩形
o.operate(new Rectangle(5,6));
//圆形
o.operate(new Circle(4));
//平行四边形
o.operate(new Parallelogram(6,9));
//三角形
o.operate(new Triangle(12,7));
}
}
运行结果:
(五)涉及到的一些基础知识
(1)关于抽象类和抽象方法
1.抽象类的作用是什么?
①抽取共性时而无法确定具体的方法体,就把方法定义为抽象的,所以抽象类不能实例化(没有方法体)。
②父类会强制子类重写,并且必须按照父类的格式,比如父类无参子类必须无参,否则报错。
③抽象方法所在的类,必须定义为抽象类。但是抽象类中不一定有抽象方法。
④抽象类可以有构造方法,在实例化子类的对象的时候,无论父类是否为抽象类,子类都会默认在自己的构造方法的里调用父类的构造方法,初始化一个子类会优先初始化它的父类。
2.抽象类的子类
子类要么重写抽象类中的所有抽象方法,要么自己本身就是抽象类。
3.抽象类和抽象方法定义的格式
①定义抽象方法:
修饰符 abstract 返回值类型 方法名 (参数列表);
特别注意:没有方法体,以分号结束
声明抽象方法的限制:不能是static/private/final修饰的方法
②定义抽象类:
修饰符 abstract class 类名{}
(2)关于多态
1.什么是多态?
同类型的对象,表现出的不同形态。
比如同为人类(Person类),而张三是学生类(Student类),李四是老师类(Teacher类),那么人类就是学生类和老师类共同的父类。
2.多态的表现形式
父类类型 对象名称= 子类对象;
创建对象:
父类类型 对象名称=new 子类对象();
例如:Person p=new Student();
3.多态的前提
①有继承关系
②有父类引用指向子类对象
③有方法的重写
4.多态调用成员的特点
①变量调用,编译看左边,运行看右边。
javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,则编译成功,如果没有则直接编译失败。
例如:Person p=new Student();
sout(p.name)
此时输出的就是父类的name变量的值,而不是Student类
②方法调用:编译看左边,运行看右边。
javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,则编译成功。
原因:子类对父类的方法进行了重写,那么在虚方法表中会把父类的方法进行覆盖。
5.多态的优劣
①多态的优势
在多态形势下,右边对象可以实现解耦合,便于扩展和维护。
在方法中,使用父类类型的变量作为参数,则可以接受所有子类的对象。
②多态的弊端
不能使用子类特有的功能
③解决多态不能实现子类特有功能的方法
将变量的类型强制转换为子类类型
例如:
Person p=new Student();
Student s=(Student)p;
转换的时候可以用instanceof关键词进行判断,比如用if语句判断是学生类还是老师类,然后实现具体的功能。文章来源:https://www.toymoban.com/news/detail-477370.html
注意不能随意转换,比如Person类型的Student对象只能转换为Student类型的Studentd对象,而不能转换为Teacher类型的。文章来源地址https://www.toymoban.com/news/detail-477370.html
到了这里,关于JAVA:定义一个抽象类Shape,计算各种子类图形的面积(简易详细版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!