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修饰 因为抽象类需要被继承
作用:统一向上造型的类型;