Java——抽象类和抽象方法

时间:2022-08-16 20:02:10

  抽象方法和抽象类必须使用 abstract 修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法。

》抽象方法和抽象类的规则如下:

  》抽象类必须使用 abstract 修饰符来定义,抽象方法也必须使用 abstract 修饰符来修饰,抽象方法不能有方法体。

  》抽象方法不能被实例化,实例化的工作应该交由它的子类来完成,它只需要一个引用即可。

  》抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初识化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。

  》含有抽象方法的类(包含直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。

  》abstract 不能与 private、static 、 final 或 native 并列修饰同一个方法

  》abstract 不能与 final 并列修饰一个类

  》子类中的抽象方法不能与父类的抽象方法同名。

  》抽象方法必须由子类来进行重写,否则没有存在的意义。

》父类
public abstract class Shape {

private String color;

//定义一个计算周长的抽象方法
public abstract double calPerimeter(); //抽象方法,不能有方法体

//定义一个返回形状的抽象方法
public abstract String getType();


//定一个Shape 的构造器,该构造武器并不是用于创建Shape 对象
//而是用于被子类调用
public Shape() {
}
public Shape(String color) {
System.
out.println("执行 Shape 的构造器");
this.color=color;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}

}

》子类

public class Triangle extends Shape {

private double a;
private double b;
private double c;

public Triangle(String color, double a, double b, double c) {
super(color);
this.setSides(a, b, c);
}

public void setSides(double a,double b,double c){
if(a>=b+c || b>=a+c || c>= a+b){
System.
out.println("三角形两边之和必须大于第三边");
return;
}
this.a=a;
this.b=b;
this.c=c;
}

//重写父类方法
@Override
public double calPerimeter() {
return a+b+c;
}

@Override
public String getType() {
return "三角形";
}

}

 

public class Circle extends Shape {
private double radius;

public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
public void setRadius(double radius){
this.radius=radius;
}

//重写父类的计算周长方法
@Override
public double calPerimeter() {
return 2* Math.PI * radius;
}

@Override
public String getType() {
return getColor() +"圆形";
}


public double getRadius() {
return radius;
}

}

》测试类

public static void main(String[] args) {

Shape s1
= new Triangle("黑色",3,4,5);
Shape s2
=new Circle("黄色",3);

System.
out.println(s1.getType());
System.
out.println(s1.calPerimeter());
System.
out.println(s2.getType());
System.
out.println(s2.calPerimeter());
}

 注意:abstract 不能用于修饰成员变量,不能用于修饰局部变量,即没有抽象变量、没有抽象成员变量等说法;abstract 也不能用于修饰构造器,没有抽象构造器,抽象类里面定义的构造器只能是普通构造器。