Java抽象类的定义
在Java中abstract是抽象的意思,可以修饰类、成员方法,由abstract修饰的方法叫抽象方法,由abstract修饰的类叫抽象类。
抽象类是为了把相同的但不确定的东西的提取出来,为了以后的重用,定义成抽象类的目的,就是为了在子类中实现抽象类。
Java抽象类的特点
抽象方法的3个特征如下:
1、抽象方法没有方法体;
2、抽象方法必须存在于抽象类中;
3、子类重写父类时,必须重写父类所有的抽象方法。
注意:在使用abstract关键字修饰抽象方法时不能使用private修饰,因为抽象方法必须被子类重写,而如果使用了private声明,则子类是无法重写的。
Java抽象类的语法
1.抽象类语法
修饰符 abstract class 类名{ }
代码示例:
//抽象类由abstract修饰 public abstract class Student{ }
2.抽象方法语法
修饰符 abstract 返回值类型 方法名称(形参列表)
//抽象类由abstract修饰 public abstract class Student{ //抽象方法由abstract修饰,不能有代码体 public abstract void study(); }
注意事项:一个类中定义有抽象方法的话,该类必须也被abstract修饰,否则会报错!
抽象类的使用原则
1.抽象类和抽象方法都要使用abstract关键字声明;
abstract class Animal { //抽象方法 public abstract void eat(); //抽象方法,是指没有方法体的方法 //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体 }
2.如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的;
//抽象类由abstract修饰 public abstract class Student{ //抽象方法由abstract修饰,不能有代码体 public abstract void study(); }
3.抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
4.抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
abstract class Animal { //抽象方法 public abstract void eat(); public Animal(){} } class AbstractDemo{ public static void main(String[] args) { //创建对象 Animal a = new Animal(); } }
输出错误:
AbstractDemo.java:11: 错误: Animal是抽象的; 无法实例化 Animal a = new Animal(); ^ 1 个错误
抽象的类不能进行实例化原因是:因为它不是具体存在的类,不能直接使用new关键字调用其构造器生成该类的对象。
5.抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
6.子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法,如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
抽象类的使用案例
为了更好的使用好Java抽象类,这里给大家举一个几何图形的例子。
不同几何图形的面积计算公式是不同的,但是它们具有的特性是相同的,都具有长和这两个属性,也都具有面积计算的方法,那么可以定义一个抽象类,在该抽象类中含有两个属性(width和height)和一个抽象方法area(),具体步骤如下:
1)首先创建一个表示图形的抽象类Shape
public abstract class Shape { public int width; // 几何图形的长 public int height; // 几何图形的宽 public Shape(int width, int height) { this.width = width; this.height = height; } public abstract double area(); // 定义抽象方法,计算面积 }
2)定义一个正方形类,该类继承自形状类Shape,并重写了area()抽象方法
public class Square extends Shape { public Square(int width, int height) { super(width, height); } // 重写父类中的抽象方法,实现计算正方形面积的功能 @Override public double area() { return width * height; } }
3)定义一个三角形类,该类与正方形类一样,需要继承形状类Shape,并重写父类中的抽象方法area()
public class Triangle extends Shape { public Triangle(int width, int height) { super(width, height); } // 重写父类中的抽象方法,实现计算三角形面积的功能 @Override public double area() { return 0.5 * width * height; } }
4)最后创建一个测试类
public class ShapeTest { public static void main(String[] args) { Square square = new Square(5, 4); // 创建正方形类对象 System.out.println("正方形的面积为:" + square.area()); Triangle triangle = new Triangle(2, 5); // 创建三角形类对象 System.out.println("三角形的面积为:" + triangle.area()); } }
Shape类的最后定义了一个抽象方法area(),用来计算图形的面积,然后通过继承后的子类Square 和Triangle分别抽象方法area()方法。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》