java 中抽象类虽然不能够创建对象,但是可以有构造方法,构造方法也可以带参数 为什么

2024-11-10 16:04:05
推荐回答(2个)
回答1:

抽象类概念我就不多说了,简单说父亲是抽象类的类必须实现所有抽象方法,除非这个类也是抽象类。说明下你问的问题
1.首先你要搞清楚java里new这个关键字,new说的是要调用构造方法,分配内存空间,创建实例,这是显示的new出来一个对象,抽象类是不允许new的,但是抽象类可以有构造方法,我们知道通常创建类的实例需要new 类();这种形式,但是只能说new调用构造方法才是创建对象,而抽象类不可以有实例,但是可以调用构造方法,因为它不是new调用,而是通过new子类,根据依赖关系,自动调用的,稍微扩展点说java中字节码文件.class中有init初始化方法,JVM要想用一个类,必须要有加载,连接,初始化这三部分组成,而只有加载这个过程对程序员可见,这就扯到类加载器classloader上去了,不多说,和这问题无关。最终结论是说,调用构造方法不一定创建实例(看怎么调用),创建实例也不一定需要调用构造方法,比如调用本地函数,通过C++等创建实例,java垃圾回收机制只能自动回收new出来的对象,并不会回收通过本地native方法创建的对象,因为这种是通过c++创建的,当然垃圾回收机制和你问的问题也没关系,不多说。

回答2:

抽象类(abstract class)因为里面有抽象方法,所以叫抽象类。
跟一般的类就在这里有区别。可以跟一般的类一样有构造方法。无参,有参的构造都行。
可以声明抽象类的对象。但是不可以实例化对象。必须依靠子类来实例化。
例如:abstract class A{
int i;
public A(){}
public A(int v){i=v;}
public abstract void fun();
}
calss B extends A{
public B(){}
public B(int v){
super(v);
}
public void fun(){
System.out.println("B");
}
}
public class C{
A a=new B();
a.fun();

}注意:抽象类被继承,子类必须复写其中的所有抽象方法。