为什么抽象类的构造函数可以走到?
我们都知道抽象类的不能实例化,不能使用关键字 new 和构造函数一起使用,
我却发现,通过子类的 super()可以走到,为什么啊?
请看下面的代码:
package com.test;
public class Test
{
public static void main(String[] args)
{
Student s = new Student();
}
}
abstract class Person
{
public Person()
{
System.out.println( "抽象类的构造器 ");
}
public abstract void display();
}
class Student extends Person
{
public Student()
{
//super();
}
public void display()
{
}
}
居然可以打印出: 抽象类的构造器,
但是 直接new就报错,为什么啊?
------解决方案--------------------如果子类的构造方法中没有显示的调用父类的构造方法,则产生子类对象时,系统默认调用无参数构造方法,即
public Student()
{
//super();
}
中写不写super();都一样
感觉这个例子和抽象类没有关系啊
------解决方案--------------------不能实例化并不代表不能有构造函数
------解决方案--------------------假如一个类里包含了一个或多个抽象方法,类就必须指定成abstract
------解决方案--------------------一个类没有构造方法,她会首先去父类找构造方法的,如果自己有构造方法,她首先调用的是自己的构造方法
------解决方案--------------------Student 类new了,就有内存了
------解决方案--------------------你说的有点道理,请问 此时 抽象类 有没有获得系统分配的内存???
?估计你把类的实例与类搞混了。
目前有一个子类的实例,同时也是一个完全实现了抽像类的实例。可以当成那个抽像类来看。
------解决方案--------------------楼主想错了,抽象类是不可以直接被我们new出来,但是可以被它子类的构造函数调用
抽象只是代表它希望有人继承它,实现它的某些方法,并不是说,它永远不能被使用,类的初始化顺序你要清楚,
父类的静态成员,静态初始化块,子类静态成员,静态初始化块,父类成员变量,父类构造函数,子类成员变量,子类构造函数
------解决方案--------------------abstract