数组也是对象,只不过有些特殊而已,既然有new存在,就说明在内存中创建了对象,为其开辟了一片空间,但是抽象类不能实例化。那么new出来的Person数组放在哪了呢?内存中又是怎么分配的呢?
是不是说抽象类不可以创建对象,但是又可以创建数组,就有些矛盾呢?
求解答,最好有图并分好步骤的解释,谢谢。 作者: 陈科宇 时间: 2013-2-5 12:01
朋友,你这里有个误解。以为Person[] p = new Person[2]创建了两个person对象。看了下面的代码就明白了。
public class PersonTest
{
public static void main(String[] args)
{
Person[] p = new Person[2];//用抽象类创建数组
System.out.println("p[0]==null:"+(p[0]==null));
System.out.println("p[1]==null:"+(p[1]==null));
//再创建两个对象
p[0] = new Student("Sun");
p[1] = new Worker("Wu");
System.out.println(p[0].getName() + ":" + p[0].getDescription());
System.out.println(p[1].getName() + ":" + p[1].getDescription());
/*
* p[0]==null:true
* p[1]==null:true
*Sun:I'm a student.
*Wu:I'm a worker.
*
*/
}
} 作者: 陈科宇 时间: 2013-2-5 12:09
朋友,你的Person[] p = new Person[2],只是确定了数组的类型为Person,长度为2,而此时并没有Person对象产生。只有当你赋值给p[0],p[1]时数组的两个元素才不为null。希望我的解答对你有帮助。作者: 吴在强 时间: 2013-2-5 15:11
你认真看看你代码,你自己创建的代码如下:
//问题:关于抽象类不能创建对象,但能创建数组的测试
//抽象类Person
abstract class Person
{
private String name;
public Person(String name)
{
this.name = name;
}
//抽象方法:对人的描述,但对每种人的描述是不清楚的,所以用抽象方法
public abstract String getDescription();
public String getName()
{
return name;
}
}
//Student继承父类Person
class Student extends Person
{
public Student(String name)
{
super(name);
}
//复写超类的抽象方法,对学生进行具体描述
public String getDescription()
{
return "I'm a student.";
}
}
//Worker继承父类Person
class Worker extends Person
{
public Worker(String name)
{
super(name);
}
//复写超类的抽象方法,对工人进行具体描述
public String getDescription()
{
return "I'm a worker.";
}
}
//测试
public class PersonText
{
public static void main(String[] args)
{
Person[] p = new Person[2];//用抽象类创建数组
//再创建两个对象
p[0] = new Student("Sun");
p[1] = new Worker("Wu");
System.out.println(p[0].getName() + ":" + p[0].getDescription());
System.out.println(p[1].getName() + ":" + p[1].getDescription());
}
}
Person[] p = new Person[2];这个创建出来的就是数组对象,而不是Person对象。
下面两个是java的多态,父类指向子类对象
p[0] = new Student("Sun");
p[1] = new Worker("Wu");
所有过程都没有直接创建抽象类的对象啊,p[0] = new Student("Sun");p[0]指向的是实现类的对象
抽象类是创建不了对象滴
但是可以有实现类的对象
创建的地址指向过程是 这样的:
C:\\tuxian.PNG
陈科宇 发表于 2013-2-5 12:09
朋友,你的Person[] p = new Person[2],只是确定了数组的类型为Person,长度为2,而此时并没有Per ...
虽然是null,但是还是赋值了啊,只不过是空而已,是对对象更确切地说是数组,初始化了而已。既然可以Person[] p = new Person[2]这样写,就说明在堆内存中是存在的,我目前知道的是,堆内存中只有对象,那么这个所谓的不能创建对象,到底是怎么回事,我只是不太明白在堆内存中的分配情况。作者: 陈科宇 时间: 2013-2-5 15:24