JAVASE 小白学习笔记(9)初进面向对象-抽象类,抽象方法

1.抽象概念的引入

在继承关系中,我们将子类中的共性功能向上抽取到父类,并且对这些共性功能在父类中给出了具体的实现。但是实际上父类并不知道子类对于共性功能的具体实现,所以可以将共性功能抽象出来,具体的实现细节由子类自身的差异性,去具体实现。
换句话说,父类只需要给出共性功能的声明即可,也就是把共性功能定义为抽象的。

public class MyTest {
    
    
    public static void main(String[] args) {
    
    
        Aniaml aniaml= new Cat();
        aniaml.setName("泰迪");
        aniaml.setAge(3);
        System.out.println(aniaml.getName());
        System.out.println(aniaml.getAge());
        aniaml.eat();
        aniaml.sleep();
        //需要访问子类中特有的功能,需要向下转型
        Cat cat= (Cat) aniaml;
        cat.catchMouse();

    }
}
//父类,抽象类
abstract  class Aniaml{
    
    
    //父类中的成员变量
    private String name;
    private  int age;
    /*父类只需要给出共性功能声明即可,也就是把
      共性功能定义为抽象的
     */
    public abstract void eat();
    public abstract void sleep();
    //设置set,get方法
    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
}

//子类:猫类
class Cat extends Aniaml{
    
    
    @Override
    public void eat() {
    
    
        System.out.println("小猫吃鱼");
    }

    @Override
    public void sleep() {
    
    
        System.out.println("小猫喜欢在温暖的地方睡觉");
    }
    public void catchMouse(){
    
    
        System.out.println("猫抓老鼠");
    }
}

输出的结果为:
泰迪
3
小猫吃鱼
小猫喜欢在温暖的地方睡觉
猫抓老鼠


2.抽象类与抽象方法

  • abstract关键字为抽象的意思,可以修饰方法,也可以修饰类
  • 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类须定义为抽象类
抽象类与抽象方法的注意事项
一旦类中有了抽象方法,此类必须定义为一个抽象类
一个抽象类中,可以没有抽象方法,当然也可以有非抽象方法
抽象类中可以有抽象方法,也可以有非抽象的方法。非抽象方法,可以让子类进行继承使用;抽象方法强制子类必须进行重写
抽象类中存在构造方法,作用是:创建子类时,先初始化父类的数据
抽象类不能直接创建其对象,可以直接采取多态的方式,间接进行实例化
作为抽象类的子类,必须重写父类中所有的抽象方法;当然也可以不重写父类中的抽象方法,将自己定义为抽象类即可
public class MyTest {
    
    
    public static void main(String[] args) {
    
    
        /*1.一个类中有了抽象方法,此类也必须定义为抽象类
          2.抽象类中可以有抽象方法,可以有非抽象方法
          3.非抽象方法可以让子类继承使用,抽象方法要强制
          子类必须进行重写
          4.抽象类中存在构造方法,作用是:创建子类时,
          先初始化父类的数据
          5.抽象类不能直接创建其对象,可以采取多态的形式
          进行实例化
         */
        Fu fu = new Zi();
        //多态形式访问成员变量,编译看父类,运行看父类
        System.out.println(fu.num);//50
        //多态访问成员方法,成员方法有重写,编译看父类,运行看子类
        fu.show();
    }
}

//父类,抽象类
abstract  class Fu{
    
    
    //父类的空参构造
    public Fu(){
    
    
        System.out.println("父类构造执行了");
    }
    //父类的成员变量
    int num=50;
    //抽象方法
    public abstract void show();
}

class Zi extends Fu{
    
    
    //子类的构造方法
    public Zi(){
    
    
        System.out.println("子类构造执行了");
    }
    //子类的成员变量
    int num=200;
    //子类重写父类中的成员方法
    @Override
    public void show() {
    
    
        System.out.println("子类重写父类的show方法");
    }
}

输出的结果为:

父类构造执行了
子类构造执行了
50
子类重写父类的show方法
/*作为抽象类的子类,必须重写子类中的抽象方法,
或者将子类自己定义为一个抽象类
 */
public abstract class CC {
    
    
    public abstract void cc();
    public abstract void cc1();
    public abstract void cc2();
}
//方式一:重写父类CC中的所有抽象的方法
class DD extends CC{
    
    
    @Override
    public void cc() {
    
    

    }

    @Override
    public void cc1() {
    
    

    }

    @Override
    public void cc2() {
    
    

    }
}
//方式二:将子类ee也定义为抽象类,将父类中抽象方法继承使用
abstract  class EE extends CC{
    
    
    
}

3.抽象类与抽象方法的简答题

1.一个类中如果没有抽象方法,可不可以定义为抽象类?如果可以,有何意义?

抽象类中可以有抽象方法,可以有非抽象方法。非抽象方法可以继承让子类进行使用,抽象方法要求子类必须进行重写。

一个类中如果没有抽象方法,可以定义为抽象类。外界不能直接创建该抽象类的对象。

2.abstract关键字不能与哪些关键字进行共存?

abstract关键字不能共存的关键字
abstrct不能与fianl关键字进行共存:abstract强制子类重写方法,final修饰的方法不能被子类进行重写
abstract不能与private关键字进行共存:private修饰的方法无法继承,也无法进行重写
abstract不能与static关键字共存:静态方法不参与重写,abstract修饰的方法要求子类进行重写

猜你喜欢

转载自blog.csdn.net/qq_41537102/article/details/110565604