Java——抽象类和抽象方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java——抽象类和抽象方法相关的知识,希望对你有一定的参考价值。
抽象方法和抽象类必须使用 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 也不能用于修饰构造器,没有抽象构造器,抽象类里面定义的构造器只能是普通构造器。
以上是关于Java——抽象类和抽象方法的主要内容,如果未能解决你的问题,请参考以下文章