面向对象--抽象类--抽象类的概述和特点

抽象类的概述和特点

/*
        抽象的表述:
            我们之前所说的猫,狗,猪,羊驼,熊猫等等都是动物的具体的例子,而动物本身是一个抽象的
            概念,而我们之前是将动物写成了一个类,而类又可以创建对象,但是呢,实际上抽象的东西本身应该不能
            实例化,并且动物这个概念中吃的方法,以及动物共有的方法本身也是一个不具体的方法,
            我们在今天之后,把一个不具体的功能,叫做抽象方法,而如果说一个类中包含有抽象方法的时候,
            这个类叫做抽象类。

        抽象类的特点:
            1、抽象类和抽象方法要用abstract关键字修饰

                修饰类 放在class前面
                    举例:
                        abstract class Animal3{}

                修饰方法 放在访问权限修饰符的后面
                    举例:
                        public abstract void eat();

            2、有抽象方法的一定是抽象类,抽象类不一定有抽象方法,具体的类中不能有抽象方法
            3、抽象类不能被实例化
                既然不能被实例化,那写在抽象类中具体的方法怎么去调用呢?               
                利用多态的形式,通过具体的子类实例化去调用方法
            4、如果继承抽象类是一个具体的类,要重写抽象类所有的抽象方法
                如果是一个抽象类继承抽象类,不需要重写抽象类中的方法
*/

//定义了一个抽象类,叫Animal3
abstract class Animal3{
    //注意:
    //  抽象方法没有方法体{},连大括号都没有,直接以分号结尾
     public abstract void eat();
//Error抽象方法不能有主体
//    public abstract void eat(){};
  
   //抽象类中可以有实例方法
    public void fun(){
        System.out.println("这是抽象类中的具体实现的fun方法");
    }
}

class Dog3 extends Animal3{
  //如果继承抽象类是一个具体的类,要重写抽象类所有的抽象方法
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
    //具体的类中不能有抽象方法
//    public abstract void show();
}

abstract class Demo2 extends Animal3{
//如果是一个抽象类继承抽象类,不需要重写抽象类中的方法
}

public class AbstractDemo1 {
    public static void main(String[] args) {
        //Animal3是抽象的; 无法实例化
//        Animal3 a = new Animal3();

        //使用抽象多态的形式创建
        Animal3 a = new Dog3();
      //通过具体的子类实例化去调用方法
        a.eat();
        a.fun();
    }
}

程序示例

/*
    在抽象的动物类中定义两个抽象方法。吃饭和睡觉。
*/

abstract class Animal4{
    //定义一个抽象方法吃饭,不给出具体实现
    public abstract void eat();

    //定义一个抽象方法睡觉,不给出具体实现
    public abstract void sleep();
}

class Dog4 extends Animal4{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    @Override
    public void sleep() {
        System.out.println("狗侧着睡");
    }

    public void lookDoor(){
        System.out.println("看门");
    }
}

class Cat4 extends Animal4{

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void sleep() {
        System.out.println("猫趴着睡");
    }
}

public class AbstractTest1 {
    public static void main(String[] args) {
      //使用抽象多态创建第一个对象
        Animal4 a = new Dog4();
        a.eat();
        a.sleep();
      
      //多态无法使用子类特有的方法
//        a.lookDoor();
      //向下转型使用子类特有的方法
        Dog4 d = (Dog4)a;
        d.lookDoor();

        //使用抽象多态创建第二个对象
        Animal4 a2 = new Cat4();
        a2.eat();
        a2.sleep();
    }
}
posted @ 2021-12-11 23:01  赤兔胭脂小吕布  阅读(269)  评论(0编辑  收藏  举报