声明抽象类与抽象方法
public abstract class ClosedFigure //闭合图形抽象类
{
public abstract double area(); //计算面积,抽象方法,以分号”;”结束
}
}
抽象类的特点
1.构造方法、静态成员方法不能被声明为抽象方法。
2.一个非抽象类必须实现从父类继承来的所有抽象方法。
3.不能创建抽象类的实例。例如:
ClosedFigure g = new ClosedFigure(); //语法错
抽象类与抽象方法的作用
抽象类:
package day17;
//当类中某个方法要,但是实现方法又不好写,想让子类来帮助实现,这时就把这个类声明成抽象类
public abstract class CloseFigure {
//如果一个类中包含抽象方法,这个类必须声明成抽象类
//抽象类无法实例化(new对象)
//声明成抽象的关键字:abstract
//抽象方法:没有方法体的方法
//抽象方法如何写:1.必须在前面加包括关键字abstract 2.直接以分号结束,不用写方法体
private String shape;
public CloseFigure(String shape) {
//强制子类通过构造传参为shape赋值
this.shape=shape;
}
public abstract double area();//在使用多态时解决编译时多态,限制子类必须实现
// public double permiter(){
// return 0;
// }
public abstract double permiter();
public String toString(){
return "形状:"+shape+",area:"+this.area()+",permiter:"+permiter();
}
}
子类
package day17;
public class Rectangle extends CloseFigure{
private int height;
private int width;
public Rectangle(int width,int height){
super("矩形");
this.width=width;
this.height=height;
}
//子类如果继承抽象父类,必须要实现父类中的 所有 抽象方法,否则该子类也必须声明成抽象类,直到有一个类实现这些抽象类
@Override
public double area() {//方法必须要一样--相当于覆盖
return height*width;
}
@Override
public double permiter() {
return 2*(height+width);
}
}
package day17;
public class Ellipse extends CloseFigure{
private int b;//短轴
private int a;//长轴
public Ellipse(String shape) {
super(shape);
}
public Ellipse() {
super("未知");
}
public Ellipse(int a,int b){
super("椭圆");
this.a=a;
this.b=b;
}
//子类如果继承抽象父类,必须要实现父类中的 所有 抽象方法,否则该子类也必须声明成抽象类,直到有一个类实现这些抽象类
@Override
public double area() {//方法必须要一样--相当于覆盖
return a*b*3.14;
}
@Override
public double permiter() {
return 2*3.14*b+4*(a-b);
}
}
Ellipse的子类
package day17;
public class Circle extends Ellipse{
private int r;//短轴
public Circle() {
super("圆");
}
public Circle(int r){
// super("圆");
this();
this.r=r;
}
//子类如果继承抽象父类,必须要实现父类中的 所有 抽象方法,否则该子类也必须声明成抽象类,直到有一个类实现这些抽象类
@Override
public double area() {//方法必须要一样--相当于覆盖
return r*r*3.14;
}
@Override
public double permiter() {
return 2*3.14*r;
}
}
package day17;
public class Run {
public static void main(String[] args) {
demo1();
// demo2();
}
public static void demo1() {
CloseFigure r=new Rectangle(10,20);
System.out.println(r.area());//1.编译时多态,2.运行时多态
System.out.println(r);//r.toString()
CloseFigure e=new Ellipse(20,10);
System.out.println(e.area());//1.编译时多态,2.运行时多态
System.out.println(e);//e.toString()
}
public static void demo2() {
CloseFigure cfs[]=new CloseFigure[10];
for(int i=0;i<cfs.length-1;i++){
if(i%2==0){
cfs[i]=new Rectangle(10+i,20+i);
}else{
cfs[i]=new Ellipse(20+i,10+i);
}
}
cfs[cfs.length-1]=new Circle(5);
print(cfs);
}
public static void print(CloseFigure cfs[]){
//通吃所有子类对象
for(CloseFigure cf:cfs){
System.out.println(cf);
}
}
}
运行结果
demo1()
demo2()