1、抽象类没有抽象方法时,继承关系上与正常类一样。
2、但当抽象类包含抽象方法时,除了子类也是抽象类以外,继承它的类必须要对该抽象方法实施(或者重写)。
Class 'Normal' must either be declared abstract or implement abstract method 'method2()' in 'AbTest'
注:重写是指子类定义了一个与父类具有相同名称、参数和返回值类型的方法,并且子类的访问修饰符应高于父类,这样使得调用该方法时,会优先执行子类中的方法而非父类中的方法,重写用于改变继承来的方法的行为。
拓展:在向上转型时,属性跟随引用,行为(方法)跟随实例(对象实际上还是子类的)。因此抽象方法支持继承它的子类向上转型。
冲突:'method3()' in 'abstractTest.Normal' clashes with 'method3()' in 'abstractTest.AbTest'; attempting to use incompatible return type
更低访问:'method3()' in 'abstractTest.Normal' clashes with 'method3()' in 'abstractTest.AbTest'; attempting to assign weaker access privileges ('private'); was 'public'
3、抽象类可以继承普通类,或者说普通类可以被正常继承。比如被所有类直接或间接继承的Object类,抽象方法也继承了这个类。
4、抽象类不能被实例化。('AbTest' is abstract; cannot be instantiated)在Java中,抽象方法是没有被实现的方法,它只是一个声明,没有提供完整的实现,无法完成具体的操作;如果一个类包含抽象方法,那么这个类必须声明为抽象类。它也是一个声明,目的是为其子类提供一个模板。子类必须实现抽象类中所有的抽象方法(实现后允许子类添加新的重载方法),才能被实例化。
拓展:(部分回答参考chatGPT3.5)
1.)抽象类能加载到内存吗?
抽象类可以被加载到内存中。但是不能被直接实例化,必须通过继承该抽象类并实现其抽象方法后才能创建对象。
当一个抽象类被加载到内存当中时,Java虚拟机会为其分配内存空间,并将其放入方法区中的运行时常量池中,Java虚拟机会检查该类的字节码文件是否符合Java语法规范和安全规则,如果存在错误或不安全的代码,则会在加载阶段抛出异常。
2.)抽象类可以由构造方法吗?
抽象类可以由构造方法,抽象类的构造方法是用来初始化该类的成员变量和执行其他必要操作。由于抽象类不能被实例化,其构造方法只能被其子类调用。构造方法不能被声明为抽象方法。
当一个子类实例化时,它会先调用父类的构造方法来初始化父类,然后执行自己的构造方法
3.)构造方法的作用:初始化对象的成员变量、执行其他必要的操作、限制对象的创建方式(通过访问修饰符、参数列表。例如private防止其他类直接创建该类的对象)、支持继承。