A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

以前一直以为只要调用了构造方法就实例化了对象,其实不然,在思考继承和抽象的时候发现,抽象类是可以有构造方法的,但是不能实例化,一个抽象类的子类实例化过程中是调用了父类的构造方法的,但是父类没有实例化:
abstract class A1 {
A1(){
  System.out.println("A1");
}
  public abstract void show();
}

class A2 extends A1{
A2(){
  System.out.println("A2构造方法");
}
public void show(){
  System.out.println("A2.show方法");;
}
这里new A1();是错误的,无法通过编译;
但是new A2();结果:
A1构造方法
A2构造方法

3 个回复

倒序浏览
抽象类的特点:
抽象方法一定在抽象类中,抽象类不可以创建对象,抽象类中的方法被使用必须由子类覆写抽象类中的所有抽象方法,建立子类对象调用,如果子类只覆盖了部分抽象方法,子类还是一个抽象类
A1是抽象类无法创建对象,A2继承了A1,A2覆写了A1的抽象方法,可以创建对象,它会默认调用A1的构造函数,进行初始化,就相当于A2的构造函数的第一行,隐藏了super();
回复 使用道具 举报
每个子类的构造方法中都传会调用父类的构造方法啊
回复 使用道具 举报
我觉得你这样说有点奇怪,既然能通过编译,其实就已经是实例化了一个对象。而编译不通过,不就说明调用不成功吗。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马