概念
抽象类顾名思义听起来就很抽象,那我们能否具体的描述出一个抽象的对象呢?答案当然是否定的,所以如果一个类中没有足够的信息能够描述一个对象,那么这个类就是一个抽象类。因此抽象类是无法直接实例化出一个对象的。
那么抽象类存在的意义在哪?
在重写当中,父类当中的方法,被子类重写,在动态绑定的过程中,会产生不同的结果,实际的工作几乎都是由子类中的重写的方法完成的,因此可以把父类当中的方法写为抽象方法。
语法
被abstract修饰的类就叫做抽象类,同理被abstract修饰的方法就叫抽象方法,在抽象类中也可以加普通的方法和字段。
父类:
public abstract class Shape {
public abstract void draw();//抽象方法
}
子类:
public class circle extends Shape {
@Override
public void draw() {
System.out.println("⚪");
}
}
public class Triangle extends Shape{
@Override
public void draw() {
System.out.println("🔺");
}
}
public class Rect extends Shape{
@Override
public void draw() {
System.out.println("♦");
}
}
主函数:
public class TestShape {
public static void printShape(Shape a){
a.draw();
}
public static void main(String[] args) {
// Shape shape=new Shape();//shape是一个抽象类无法被实例化
printShape(new circle());//匿名对象
printShape(new Rect());
printShape(new Triangle());
}
}
特性
一、由于抽象类肯定是要被继承的,因此抽象类不能被final修饰的(被final修饰无法被继承);
二、由于抽象方法肯定是要被重写的,因此抽象方法是不能被final,static,private修饰的(没有访问限定符时默认时public);
三、若是子类不重写父类当中的抽象方法,则子类也是抽象类,必须要用abstract修饰,不管怎么样,只要其他类再次继承,就必须重写继承下来的抽象方法。
eg:
public abstract class Animal {
String name;
int age;
public abstract void var();
}
public abstract class Cat extends Animal {
public abstract void price();
}
public class Rogdoll extends Cat{
public Rogdoll(String name,int age){
this.name=name;
this.age=age;
}
@Override
public void var() {
System.out.println("布偶猫");
}
@Override
public void price() {
System.out.println("20000");
}
}
public class TeatDemo {
public static void kinds(Animal a){
a.var();
}
public static void prices(Cat b){
b.price();
}
public static void main(String[] args) {
kinds(new Rogdoll("玛卡巴卡",3));
prices(new Rogdoll("玛卡巴卡",3));
}
}
在第三个.java文件中我们看到当我们要使用前面继承下来的抽象方法时必须要重写所有累积下来的抽象方法。