抽象类
抽象类定义
在继承中,每个子类的实现方法都各不相同,父类不能直接决定他们各自的实现方法,所以在父类中只写方法声明,并不会实现具体方法。于是子类就得各自实现自己的具体方法。在类中只有方法声明的方法叫抽象方法,而拥有抽象方法的类叫抽象类。
关键字abstract:抽象的
声明:不写函数体的函数,就叫声明
抽象方法:abstract修饰的方法
抽象类:abstract修饰的类
抽象类功能:1.节省代码 2.制定规则
public class AbstractClass {
}
//抽象类
abstract class Animal{
String name;
int age;
public void bark(){};
}
抽象方法
在父类中定义的方法,无法满足子类的需求。或者如果这个方法在所有的子类中都被重写,父类中的这个方法如何实现显得没什么意义了。此时,父类如果实现这个方法,代码就会冗余;如果不定义这个方法,那么就无法表示所有的子类都有这个方法。
针对这种情况,我们可以将这种方法定义成抽象方法。
public class AbstractClass {
}
abstract class Animal{
String name;
int age;
//abstract修饰的方法称为抽象方法
public abstract void bark();
}
特点
抽象方法只有方法的声明,没有实现。
抽象方法只能定义在抽象类中。
抽象类的继承
抽象方法的一个特点是只能定义在抽象类中。如果一个非抽象子类继承一个抽象父类。那么,此时可以继承到父类中的抽象方法。那么抽象方法就存在与一个非抽象子类中了。这是有问题的。
解决方法是,继承父类抽象方法的子类,必须重写实现抽象父类中的所有抽象方法,或者把自己变为抽象类。
注意点:抽象类不能直接创建对象。但可以通过子类间接的创建对象。
public class AbstractClass {
}
abstract class Animal{
String name;
int age;
//被abstract修饰的抽象方法
//只能定义在抽象类中
public abstract void bark();
}
//方法一 重写父类中的抽象方法
class Dog extends Animal{
@Override
public void bark() {
System.out.println("汪汪~~");
}
}
//方法二 将自己变成抽象类
abstract class Cat{
}
抽象类总结
基本点总结
抽象类不一定有抽象方法,但有抽象方法的一定是抽象类。换言之抽象方法只能存在于抽象类中。
继承了抽象类的子类一定要实现抽象方法,若不实现就只能将自己也改成抽象类。
抽象类不能直接创建对象,必须通过自类实现。所以抽象类一定有子类。
普通类与抽象类区别
普通类可以直接创建对象,抽象类不能。
抽象类可以抽象方法,普通类不能有。
final,abstract,private三者比较:
三个都是不能与abstract同时存在的关键字。
- final:被final修饰的类不能有子类,方法不能重写,但是abstract必须有子类,且必须要重写
- static:被static修饰的方法可以通过类名调用,但abstract必须通过子类实现
- private:被private修饰的方法不能重写,但abstract必须要重写
抽象类使用场景
非抽象类在继承一个抽象父类时,必须重写父类中的所有抽象方法。通过这种方式,抽象类可以做一些规则指定。
在抽象父类中定义的抽象方法也就是规则,要求子类必须全部实现,同时约束所有子类的行为。
public class AbstractClass {
}
abstract class Animal{
String name;
int age;
//父类定义的bark抽象类(规则)
public abstract void bark();
}
//子类 Dog和Cat都必须实现bark这个方法
class Dog extends Animal{
@Override
public void bark() {
System.out.println("汪汪~~");
}
}
class Cat extends Animal{
@Override
public void bark() {
}
}