抽象类的构造器运行问题,(满意我再加50)

public abstract class Father
{
private int a;
public Father()
{
this.a = 100;
}
}
public class Son : Father
{
}
如上边两个类,当执行代码:
Son son = new Son();
时,Father类的构造函数被调用,a被初始化为100,Son类又继承不到a,我想问的是a放在那里,它依赖于谁?。当构造函数级联调用时,父类会创建对象吗?父类的成员是怎么放的?

刚才没看见你是要说抽象类的,现在修改下下
派生类是基类的专用化。
每个派生类均表示基类的不同专用化.
比如有类"人",派生出"男人""女人"2个派生类,则,类"男人"和"女人"是基类"人"的不同的2个专用化。
从内存分配上来说,比如"男人",就是先分配出"人"的特性所要的内存空间(不论是public,protected,还是private的字段,都是它的特性).再添加"男人"特有的特性

定义一个类从其他类派生时,派生类隐式获得基类的除构造函数和析构函数以外的所有成员。(注意,是除构造和析构,以外的所有成员,包括字段,方法,属性,事件,而不管他们的访问级别是public还是private);

内存结构的分配(假如这是一个3级派生类):
base.base.base + base.base + base + 这个专用化类的特有属性,
即使在这个派生类中,不能直接访问它的基类(或者基类的基类)中的private属性的字段,这些基类中的private字段也必须被分配内存空间并且初始化.然后可以通过继承来的方法和属性访问这些字段.既然这个字段存在,不管他是不是private,它肯定是这个基类的一个特性.
abstract 修饰符可用于类、方法、属性、索引器和事件
但是abstract不能用于字段,就是说,抽象类中的成员,除了字段和缺省构造函数,其它成员的定义都要延伸到派生类,那么,你的private的成员被分配后,就仅且仅能被它自己的构造函数访问到.

public abstract class Father
{
private int a;
public int b;
public int c;
public Father()
{
this.a = 100;
}
}
public class Son : Father
{
public int aa;
public int bb;
}

Son son = new Son();

son分配的内存结构如下(假如Father派生自有一个字段a1的基类);
public class base2{ int a1;}
public abstract class Father:base2

son----->
|base.base->a1|
|base->c |public
|base->b |public
|base->a |private
|bb |
|aa |

在son的方法中,或在son重写的方法中,不能直接访问base->a(private)
son从基类继承的方法或访问器可以访问base->a(private);

上边有人回答:
"何况父类是抽象的,无法构建对象,
"类中的a是放在son对象中的,父类并没有构建对象,谈不上成员的放置,

抽象类仅仅是不能够直接自己被实例化而已,他的字段并不是abstract的
抽象类也有自己的构造函数,如果没有显式声明构造,编译的时候会添加缺省构造函数,
抽象类的实例化:
在派生的子类实例化的时候,同时为抽象基类分配内存并调用缺省构造函数用以初始化字段的值.

再具体说下你的问题:当构造函数级联调用时,父类会创建对象吗?父类的成员是怎么放的?

private a 的内存空间分配,是在你实例化son的同时,在构造之前,先分配了内存.
不用显示调用base的构造函数,在派生类Son的构造函数执行之前,先执行abstract class Father的缺省构造函数,就是Father()不带参数的这个,如果你没有显式定义,系统编译的时候会自动加一个不带参数的Father(),里边的内容是吧它的所有字段初始化默认值.

至于"父类的成员是怎么放的?" 抽象类的字段不抽象,字段的内存分配,不区分这个类是不是抽象类.
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-04
public abstract class Father
{
private int a;
public Father(a)
{
this.a = 100;
}
}
public class Son : Father
{
}
第2个回答  2010-12-04
a放在father的结构中啊
肯定只有访问father才可以访问a
父类是抽象类,不会创建对象
父类的成员就像按静态成员的样子放的,自己找找怎么放的吧。只是它的成员子类不可以访问
第3个回答  2010-12-04
我想问的是a放在那里,它依赖于谁?
它不依赖谁,它只是Father的一个字段而已,

当构造函数级联调用时,父类会创建对象吗?
不会,何况父类是抽象的,无法构建对象,执行“Son son = new Son();”这条语句时,只会调用父类的构造函数以初始化父类成员,

父类的成员是怎么放的?
字段a被初始化为100,父类中的a是放在son对象中的,父类并没有构建对象,谈不上成员的放置,
第4个回答  2010-12-04
这个你去调试下就知道了,是son实例里面有个base ,base里面有个a =100;
要是有好几层继承就是son->base->base->a=100;
第5个回答  2010-12-05
先有一个基本的概念:抽象类不可以实例化。也就是说,如果你声明了这样一个类:
public abstract class BaseClass
{
public int someProperty = 0;
public BaseClass(int property)
{
this.someProperty = property;
}
}
然后在客户端BaseClass base = new BaseClass(1);这样调用的话,编译器会报错。
抽象类的构造函数只能在其子类的构造函数中调用,也就是说,不管是否是抽象类,无参构造自动调用,带参数的构造函数必须显式调用。可以这样在子类中调用父类的构造函数(使用base关键字):
public class ChildClass : BaseClass
{
public ChildClass(int property)
: base(property)
{

}
}

抽象类的构造器运行问题,(满意我再加50)
抽象类仅仅是不能够直接自己被实例化而已,他的字段并不是abstract的 抽象类也有自己的构造函数,如果没有显式声明构造,编译的时候会添加缺省构造函数,抽象类的实例化:在派生的子类实例化的时候,同时为抽象基类分配内存并调用缺省构造函数用以初始化字段的值.再具体说下你的问题:当构造函数级联调用时,父类...

C#中关于抽象类的问题。
投象类是不可以实例化的。这里所谓类实例化指的就是类在生成过程中调用了类的构造函数,则称该类为实例化。而抽象类没有构造函数,所以是无法实例化的。在C#编译器环境下,具体类即使不写构造函数,编译系统也会自动增加默认的实例函数,以便实例化,但是对于声明为abstract的类,术语称“抽象类”或“...

关于c++抽象类的问题
C++ 里设计了 “抽象类”目的是用作类似类的“基类”,给派生出的类 同类性质的东西 有同样的名字,但有不同的计算实现的方法。例如,抽象类 叫 平面图形,它有成员函数:面积计算,周长计算,派生出的类,非抽象类:椭圆类,矩形类,三角形类等。抽象类 作为 基类 里 面积计算,周长计算 都是 ...

抽象类有构造方法吗?
问题三:java中,抽象类可以有构造方法吗 抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。问题四:新手~~java抽象类构造方法问题 Cat myCat = new Cat(myCat); 你右边作为构造函数传入的myCat是个啥?你的程序里要求的是String类型,是不是考虑改成Cat myCat = new Cat(myCat)...

java 中 Graphics2D g2=(Graphics2D)g这句我怎么理解不了
肯定再次通过!到这里就可以编译通过 3、检查 Graphics g 是否被实例化(这里是抽象类当然不能)假如这里不是抽象的,如果父类被父类的构造器实例化,那么 运行出现异常!如果是被子类的构造器实例化的,那么执行也正确!4、并不是你说的“继承中向下转型应该不能转吧”关键是看它指向的是什么!可以...

...中抽象类虽然不能够创建对象,但是可以有构造方法,构造方法也可以带参...
1.首先你要搞清楚java里new这个关键字,new说的是要调用构造方法,分配内存空间,创建实例,这是显示的new出来一个对象,抽象类是不允许new的,但是抽象类可以有构造方法,我们知道通常创建类的实例需要new 类();这种形式,但是只能说new调用构造方法才是创建对象,而抽象类不可以有实例,但是可以调用构造...

抽象类和接口都没有构造方法
抽象类和接口都没有构造方法,这句话是错误的。接口和抽象类都可以有构造方法。接口是Java语言中的一个抽象类型,它定义了一组抽象方法(没有实现),并且可以用来被其他类实现或继承。抽象类是Java语言中的一个特殊的类,它不能被实例化。抽象类中可以包含抽象方法和非抽象方法,也可以包含实例字段和...

...老师只给了这个材料!希望大虾们帮忙!回答好再加高分!
我的 请从JAVA课本知识角度回答。小弟是要考试用的,老师只给了这个材料!希望大虾们帮忙!回答好再加高分! 1.Java应用程序与Applet程序的区别?2.抽象类是否能生成具体对象?其存在的意义?3.方法(或者函数)重载与覆盖的区别?4..构造方法为什么经常需要重载?5.构造函数(方法)为什么必须... 1.Java应用程序与Applet程...

构造函数是用来初始化所定义的对象,如果一个类中没有定义任何构造函数...
不对,c++里不写类的构造函数时,编译器会为类创建一个默认的构造函数,虽然这个函数什么都不做,但是类的对象还是会在此时初始化,不过,对象成员的值是随机的,比如,指针型成员变量可能为NULL,也有可能不为NULL。

抽象类和接口的区别
抽象类可以有构造器,接口不能有构造器。4、与正常Java类的区别 除了不能实例化抽象类之外,和普通Java类没有任何区别;接口是完全不同的类型外。5、访问修饰符 抽象方法可有public.protected和default、abstract修饰符。不能用privatestatic.synchronize、 native 修饰。接口属性默认修饰符是publicstatic ...

相似回答