abstract 关键字

    java为了表示现实生活中抽象的概念集合,提供了一个关键字给我们使用:abstract
    abstract 抽象的
    可以修饰类,修饰成员方法

  1. 被abstract修饰的类是抽象类, 抽象类不能被实例化
  2. 被abstract修饰的方法是抽象方法, 抽象方法不能有大括号实现
  3. 在抽象类,既可以存在具体实现的方法, 也可以存在抽象方法
  4. 若一个类中有抽象方法, 这个类一定是一个抽象类

  5. 当一个具体的类继承一个抽象类, 必须要实现抽象类中的所有抽象方法
  6. 当一个抽象类继承一个抽象类的时候, 可以选择性地是否重写抽象方法

 1. 一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义? 可以表示一种概念的集合
 2. abstract不能和哪些关键字共存
    final 不能共存
    static 不能共存
    private 不能共存
  • 在抽象类,既可以存在具体实现的方法, 也可以存在抽象方法
  • 被abstract修饰的方法是抽象方法, 抽象方法不能有大括号实现
  • 若一个类中有抽象方法, 这个类一定是一个抽象类
abstract class Animal2{
    //拥有具体实现的方法
    public void eat1(){
        System.out.println("吃饭");
    }

    //抽象方法
    public abstract void eat2();
    public abstract void sleep();
    //抽象方法不能有大括号实现
}
  • 被abstract修饰的类是抽象类, 抽象类不能被实例化
public class AbstractDemo1 {
    public static void main(String[] args) {
//        Animal2 animal2 = new Animal2();//无法实例化报错
    }
}
  • 当一个具体的类继承一个抽象类, 必须要实现抽象类中的所有抽象方法
class Dog2 extends Animal2{
    @Override
    public void eat2() {
        System.out.println("🐕吃🥩");
    }

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

当一个抽象类继承一个抽象类的时候, 可以选择性地是否重写抽象方法

abstract class A1 extends Animal2{

}
抽象类与类中成员的关系:
    成员变量: 抽象类既可以存在变量, 也可以存在常量
    构造方法: 可以存在构造方法, 是为了将来在继承关系做初始化的作用
    成员方法: 既可以是具体的实现方法, 也可以是抽象方法
abstract class Demo2{
    int a = 10;
    final int b = 20;

    Demo2(){}
}

class A2 extends Demo2{
    A2(){
//        super();
    }
}

public class AbstractDemo2 {
    public static void main(String[] args) {
//        Demo2 demo2 = new Demo2();
    }
}
  • abstract 的特点
    如果一个类被声明为抽象类,那么它就是为了被继承以便子类实现其抽象方法。
    抽象方法必须在子类中被实现,即被子类重写。
    抽象方法的目的是为了多态性,允许不同的子类以不同的方式实现这个方法。
  • final的特点
    final修饰的类不能被继承。
    final修饰的方法不能被重写。
    final修饰的变量一旦被初始化就不能再被修改。
  • static特点
    静态方法可以通过类名直接调用,不需要对象实例。但是抽象方法必须由子类实现后,通过对象实例来调用。
    静态方法不能被重写(只能被隐藏),就无法实现多态的效果。
    private特点
    private修饰的方法只能在当前类中被访问,子类无法访问到父类的私有方法,更无法对其进行实现。
    这与抽象方法需要在子类中被实现的本质相矛盾。
    子类将无法继承和实现父类的抽象方法,这就破坏了继承的基本原则
abstract class ShuJia{
//     abstract final void fun1(); // 非法的修饰符组合: abstract和final

//    abstract static void fun1(); // 非法的修饰符组合: abstract和static

//    private abstract void fun1(); // 非法的修饰符组合: abstract和private
}
posted @ 2024-09-24 23:02  wang_jun  阅读(69)  评论(0)    收藏  举报