抽象

1:什么是抽象:

  • 当父类知道子类应该包含什么样的方法,但无法确定子类如何实现这些方法;在分析事物时,会发现事物的共性,将共性抽取出,实现的时候,就会有这样的情况:方法功能声明相同,但方法功能主体不同,这时,将方法声明抽取出,那么,此方法就是一个抽象方法。

2:抽象的解释

第一种解释
  • 1:父类是图形,里面有计算面积的方法(抽象方法)
  • 2:子类是正方形,三角形…
第二种解释
  • 1:父类是动物,里面有吃东西的方法(抽象方法)
  • 2:子类是猫吃鱼,狗吃骨头…

如果父类当中的方法不确定如何进行实现,那么就应该是一个抽象方法

3:抽象的定义格式:

  • 1:抽象方法的定义格式:public abstract 返回值类型 方法名(参数);
  • 抽象方法,就是加上abstract关键字,然后去掉大括号,直接分号结束
  • 2:抽象类的定义格式:abstract class 类名{}
  • 抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可

4:抽象的特点

  • 1:抽象类和抽象方法都需要被 abstract 修饰,抽象方法一定要定义在抽象类中
  • 2:抽象不能直接创建对象,因为调用抽象方法没有意义
  • 3:只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象,否则该子类还是一个抽象类
  • 4:之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单

5:抽象类的注意事项

  • 1:抽象类一定是个父类,因为是不断抽取而来的
  • 2:抽象类中可以不定义抽象方法,其存在的意义就是不让该类创建对象,方法可以直接让子类去使用
  • 3:抽象关键字 abstract 不可以和以下关键字共存:
  • private:私有的方法子类是无法继承到的,也不存在覆盖,如果 abstract 和 private 一起使用修饰方法, abstract 既要子类去实现这个方法,而 private 修饰子类根本无法得到父类这个方法,互相矛盾
  • final:final 修饰的类不能被继承,而抽象类一定是父类
  • static:static 修饰的表示静态的,不能被修改的,但可以直接被类所调用,而abstract修饰的是抽象的,即没有方法实体,也不能直接被调用
pubilc abstract class Animal{
    //这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定
    public abstract void eat();
    
    //这是普通的成员方法
    public void nomalMethos(){
        //...
    }
    
}

6:抽象类和抽象方法的使用

  • 1:不能直接创建new抽象方法
  • 2:必须一个子类来继承抽象方法
  • 3:子类必须覆盖写抽象方法当中所有的抽象方法。
  • 覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体的大括号
  • 4:创建子类对象进行使用
//定义抽象方法
public abstract class Animal{
    public abstract void eat();
}
//一个子类去继承抽象方法
public class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println("猫吃鱼")
    }
}
//在main中调用
public class DemoMain{
    public static void main(String[] args){
         //错误的写法,不能直接创建抽象类对象
         //Animal animal = new Animal(); 
    
        
        Cat cat = new Cat();
        cat.eat();
    }
}