java基础---21. 抽象

1 抽象的概念

2 抽象方法和抽象类的定义格式

定义一个Animal类

/*
抽象方法:就是加上abstract关键字,然后去掉大括号直接分号结束
抽象类:抽象方法所在的类必须是抽象类才行。在class之前写上abstract即可
 */
public abstract class Animal{
    //这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
    public abstract void eat();

    //这是普通的成员方法
    public void normalMethod(){
        
    }
}

3 抽象方法和抽象类的使用

  • 创建Animal类
/*
抽象方法:就是加上abstract关键字,然后去掉大括号直接分号结束
抽象类:抽象方法所在的类必须是抽象类才行。在class之前写上abstract即可

如何使用抽象类和抽象方法:
1. 不能直接创建new抽象对象
2. 必须用一个子类来继承抽象父类
3. 子类必须覆盖重写抽象父类当中所有的抽象方法:
覆盖重写(实现):子类去掉抽象方法的abstract关键字,补上方法体和大括号
4. 创建子类对象进行使用
 */
public abstract class Animal{
    //这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
    public abstract void eat();

}
  • 创建Animal的子类Cat
public class Cat extends Animal {
    @Override//1.
    public  void eat() {//2.
        System.out.println("猫吃鱼");
    }
}
  • 调用
public class DemoMain {
    public static void main(String[] args) {
        //Animal animal = new Animal();错误写法,不能直接创建new抽象对象
        //4.
        Cat cat = new Cat();
        cat.eat();//猫吃鱼
    }
}

4 抽象方法和抽象类的注意事项

对注意事项2的理解
  • 父类
public  abstract class Fu {
    //构造方法
    public Fu(){
        System.out.println("抽象父类的构造方法执行");
    }
    //抽象方法
    public abstract void eat();
}
  • 子类
public class Zi extends Fu {
    //构造方法
    public Zi(){
        //默认赠送一个super
        System.out.println("子类构造方法");
    }
    //覆盖父类抽象方法
    @Override
    public void eat() {
        System.out.println("吃饭饭");
    }
}
  • 调用
/*
对注意事项2的理解:
类的构造方法是在创建对象(new)的时候执行的
虽然父类也有构造方法,但是由于父类是抽象类,所以父类Animal不可以创建对象(new),
因此构造方法若想执行必须要通过子类Cat的构造方法中的super来执行
 */
public class DemoMain {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.eat();
//        抽象父类的构造方法执行
//        子类构造方法
//        吃饭饭
    }
}
注意事项3的理解
/*
一个抽象类不一定含有抽象方法,
只要保证抽象方法所在的类是抽象的即可。

这样没有抽象方法的抽象类,也不能直接创建对象,在一些特殊的常景下有用
 */
public abstract class MyAbstract {
}
注意事项4的理解
  • 父类
//最高的抽象父类
public abstract class Animal {
    public abstract void eat();
    public abstract void sleep();
}
  • 子类
public abstract class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("狗吃骨头");
    }
    //到目前为止依然报错,原因:这里默认继承了父亲的
    //public abstract void sleep();这依然是一个抽象方法
    //抽象方法所在的类必须为抽象类,所以若想不报错则要让子类变成抽象类,添加abstract
}
  • 子子类
public class DogGolden extends Dog {
    @Override
    public void sleep() {
        System.out.println("呼呼呼...");
    }
}
public class Dog2H extends Dog {
    @Override
    public void sleep() {
        System.out.println("嘿嘿嘿...");
    }
}

  • 调用
public class DemoMain {
    public static void main(String[] args) {
//        Animal animal = new Animal();
//        Dog dog = new Dog();
        Dog2H dog2H = new Dog2H();
        dog2H.eat();
        dog2H.sleep();

        DogGolden dogGolden = new DogGolden();
        dogGolden.eat();
        dogGolden.sleep();
    }
}
原文地址:https://www.cnblogs.com/deer-cen/p/12236315.html