1.首先我们引出抽象,在我们过去写一个父类和写一个子类的时候,要进行子类对父类方法的重写,那么父类原来的实体方法中的方法体中的内容就没有了意义,因为方法重写后执行的是子类重写后的方法。所有我们想要将父类中需要子类重写的方法的方法体去掉,这个时候就需要用到abstract这个关键字

public class Error {

    public static void main(String[] args) {
        B b=new B();
        b.m();
    }

}

 class A{
    //属性
    String name;
    //方法
    public void m1() {
        System.out.println("父类重写方法的方法体中的代码没有意义了");
    }

    
}
class B extends A{ 
    public void m() {
        System.out.println("执行的是子类重写后的方法");
    }
}

改造后

public class Error {

    public static void main(String[] args) {
        B b=new B();
        b.m();
    }

}

 abstract class A{ //抽象类中才能有抽象方法
    //属性
    String name;
    //方法
    public abstract void m();  //改成抽象方法
    
}
class B extends A{ 
    public void m() {
        System.out.println("执行的是子类重写后的方法");
    }
}

1.一个类中有了抽象方法,此时这个类就要变成抽象类

2.如果父类是抽象类,子类要重写我们所有的抽象方法。

3.子类变成抽象类就不用全部重写父类的抽象方法。

如果一个类是抽象类,那么一定有抽象方法?不一定,有抽象方法的类才一定是抽象类。

抽象类能创建对象吗?抽象类不能创建对象。解释如下

1.在底层会对抽象类通过构造方法创建对象,但是这是通过c语言构建的对象,从而java本身是拿不到这个对象的,所以对外就是创建不了对象的。

2.抽象方法没有具体的方法体----创建出来的对象却不能调用抽象方法,会出现调用错误,任何返回的东西都没有。

import java.util.Scanner;
public class Error {

    public static void main(String[] args) {
        A a =new A(1) { //A(1)后面的{}是个匿名内部类,a这个对象不是抽象类A的对象,而是匿名内部类的对象
        };
    }

}
abstract class A{
    int i;
    public A(int i) {
        this.i=i;
    }
}

 抽象类里面可以定义属性和实体方法

抽象方法不可以被private/static/final修饰,因为抽象方法一定要被重写,而被private/static/final修饰就不能被重写了

默认访问权限修饰符修饰抽象方法? 只能在同胞子类中去实现重写

不能被final修饰 因为抽象类需要被继承

作用:统一向上造型的类型;