在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
抽象方法的书写格式:
抽象函数没有方法体,连大括号都没有;
抽象函数使用关键字abstract修饰,abstract关键字写在函数的返回值类型前面;
abstract class Demo
{
public abstract void func();
}
抽象函数表示的是逻辑类似但实现方式不唯一的功能;
如果一个类中有了抽象函数,说明这个类表示的事物也是描绘不清的(信息不足),需要定义为抽象的类
注意点:
抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
抽象类存在的意义就是被子类继承,并且重写其抽象方法
抽象类是具有构造方法的,因为子类对象实例化需要使用到
抽象类中可以定义多个构造,使其发生重载现象
抽象类可以具有一般类中的所有成员,还可以多抽象的方法
抽象类一定是父类
因为抽象函数必须被继承的子类重写,所以和不能被继承和重写的关键字都不能共存:private、final
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
abstract class Demo
{
}
//生物类
abstract class Creature
{
int i;
double d = 3.14;
static boolean b = true;
public abstract void breath();
Creature(){
System.out.println("我是Creature类中的空参构造");
}
Creature(int i){
System.out.println("我是Creature类中的有参构造");
}
public void details(){
System.out.println("我是一般方法details..");
}
}
//动物类
abstract class Animal extends Creature
{
/*
以下的eat和sleep方法在不同的动物之中描述各不相同,
所以不定义方法体,对其抽象 --> 变为抽象方法(没有方法体)
*/
public abstract void eat();
public abstract void sleep();
Animal(){
System.out.println("我是Animal中的空参构造..");
}
}
//狗类
class Dog extends Animal
{
//重写父类的抽象方法 --> 变为描述的清的方法
public void eat(){
System.out.println("狗吃肉..");
}
public void sleep(){
System.out.println("狗zzZZ");
}
public void breath(){
System.out.println("狗呼吸");
}
}
class Cat extends Animal
{
//重写父类的抽象方法 --> 变为描述的清的方法
public void eat(){
System.out.println("猫吃鱼..");
}
public void sleep(){
System.out.println("猫zzZZ");
}
public void breath(){
System.out.println("猫呼吸");
}
Cat(){
System.out.println("我是Cat类中的空参构造..");
}
}
class TestAbstract
{
public static void main(String[] args)
{
//错误: Animal是抽象的; 无法实例化
//Animal a = new Animal();
/*
Dog d = new Dog();
d.eat();
d.sleep();
*/
//创建猫对象
new Cat();
}
}
/*
1、抽象类有构造方法,抽象类中的构造方法完全是为了子类对象实例化服务的;
2、抽象类中可以一个抽象方法也没有,语法是过关的,但是很少有这种类存在
*/