public abstract class MyList extends AbstractList{
MyList(String a ){
}
public static void main(String[] args) {
MyList myList = new MyList("") {
@Override
public Object get(int index) {
return null;
}
@Override
public int size() {
return 0;
}
};
}
}
抽象类的实例化方式并不是通过普通的new方式来创建对象,而是通过父类的引用来指向子类的实例间接地实现父类的实例化,因为子类在实例化之前,一定会先实例化它的父类。这样创建了继承抽象类的子类对象,也就把其父类(抽象类)给实例化了。
MyList myList = new MyList(); 出现 new MyList()就会执行实例化一个对象了。所以如果是抽象类就不能这样new的。要new 它没有abstract的子类。
抽象类是指不允许被实例化的类;抽象方法是没有方法体的方法。
1、抽象类可以不包括抽象方法,它反正不会去实例化,抽象类不能被实例化,也就是不能用new关键字去产生对象,抽象方法只需声明,而不需实现,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类,里面的方法是不是抽象的没有本质影响。
2、但是含有抽象方法的类绝不能被实例化,否则执行这个方法的时候,怎么办?
3、如果子类是非抽象的,那么它就必须实现父类中的抽象方法;否则,它继承来的抽象方法仍然没有方法体,也是个抽象方法,此时就与“含有抽象方法的类必须是抽象类”相矛盾了。
public class MyList extends AbstractList {
MyList(String a) {
}
@Override
public Object get(int index) {
return null;
}
@Override
public int size() {
return 0;
}
public static void main(String[] args) {
MyList myList = new MyList("") {
};
}
}
抽象类与接口紧密相关,它们不能实例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变的功能,但直到需要该类的特定实现之后才实现其他方法。抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添加到基类而不中断代码。
在实现抽象类时,必须实现该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值。
注意:接口与抽象类非常类似,但是它不可以被实例化,因为接口压根没有构造函数。