1.什么是抽象类
现实世界事物中,某个事物是比较概括性(人/水果/动物),描述为抽象事物,只有具体的工人/苹果/猫或者狗,才具备具体的功能;将某个事物中的一些功能仅仅给出声明即可,没有方法体----->抽象方法---->此时这个类必须为抽象类.
举例:动物都需要吃和睡
只要看到具体的动物类:猫类/狗类,才具备吃和睡的功能
将动物类中的吃和睡给出一个声明:加入一个关键字 abstract:抽象方法
动物类----->抽象类
2.抽象方法的格式:权限修饰符(一般情况都是public) abstract 返回值类型 方法名(形式参数列表) ;
抽象类的格式: abstract class 类名{}
3.抽象类的特点:
(1)有抽象方法的类一定是抽象类
(2)抽象类中不一定只有抽象方法 ,还可以非抽象方法(有方法体)
(3)抽象类不能实例化---->意思:不能创建对象
如何实例化呢:通过具体的子类进行实例化(进行对象的创建)
抽象类多态 Fu fu = new Zi() ; Fu类型是抽象类型.
(4)抽象类的子类有两种情况:
b.目前来说:如果抽象类的子类都是抽象类---毫无意义 因为子类也不能new ,除非再有具体的子类
a.抽象类的子类具体类--->才能new :抽象多态的形式 Fu fu = new Zi() ;
4.抽象类的核心宗旨:
就是强制子类必须完成的事情(要将父类中的所有的抽象方法必须重写,否则报错)
5.抽象类的成员的特点:
成员变量:可以是变量,也可以是常量.
成员方法:既可以是抽象方法,必须携带abstract关键字,也可以是非抽象方法
构造方法:存在无参/有参构造方法 ------对数据进行初始化
6."抽象类和抽象方法"代码示例
//定义一个动物类
abstract class Animal{
public abstract void eat(); //加入关键字abstract
public void show(){//具体方法
System.out.println("show animal...");
}
public abstract void slepp() ;//睡
public Animal(){
System.out.println("Animal的无参构造方法");
}
}
//具体类
class Cat extends Animal{
public Cat(){
System.out.println("Cat的无参构造方法");
}
@Override
public void eat() {
System.out.println("猫吃鱼...");
}
@Override
public void slepp() {
System.out.println("猫趴着睡觉...");
}
//特有功能
public void playGame(){
System.out.println("猫玩毛线");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void slepp() {
System.out.println("狗侧着睡觉...");
}
//特有功能
public void catchRabit(){
System.out.println("狗可以抓兔子");
}
}
//测试类
public class AbstractDemo {
public static void main(String[] args) {
//使用多态的形式: 当前的Animal类的子类一定是具体类
Animal a = new Cat() ;//父类引用指向子类对象(父类---抽象类) : 抽象类多态
a.eat();
a.slepp();
//向下转型
Cat c = (Cat)a ;
c.playGame();
System.out.println("-------------------------");
a = new Dog() ;
a.eat();
a.slepp();
Dog d = (Dog) a;
d.catchRabit();
}
}