
构造函数申明为保护,说明该类不能被直接实例化,即不能直接new出来。 保护的构造函数除去自身外,只能被子类访问。所以这是一种潜在语义用法。 表示:定义为保护构造函数的类必须被继承使用。 所以这个题答案是:在派生类中初始化基类的方式初
瞧你这话说得!!
子类从基类继承来的变量在基类构造函数中可以初始化,在子类构造函数中也可以初始化!
在子类构造对象时,首先要调用基类的构造函数,再调用子类的构造函数;
子类对继承来的变量:
1初始化:那么可想而知,最终构造子类对象时子类对这个变量的初始化起了作用(因为先基类构造函数对其初始化,后子类构造函数对其初始化,明白吧);
2不初始化:那么可想而知,子类不干初始化这变量的事了,所以基类构造函数的初始化就发挥了作用。
总之,一句话,记住构造子类对象时,构造函数调用的顺序:始终是先调用基类构造函数,再调用子类构造函数,其他衍生出来的问题仔细想想就明白了!!
如果解决了你的疑惑,请采纳!否则请追问!加油哦!
如果不销毁自己,而是父类
那么你delete 自身的语句不是有问题么
既然你写的是delete 自身
当然先从自己开始
另外
父类与子类在存储上是包容的关系
子类内部包含父类
先析构自身的成员
然后到了父类那里
//当然,这里父类的空间是子类空间的一部分
//可以想象到覆盖,因为你delete子类,所以实行子类的
//析构,而父类在子类中,所以当析构完成到父类那里调用父类
//至于你会问为什么不县析构父类,然后在析构子类成员呢
//他们都是子类一部分啊
//因为析构是分步的,根据构造顺序,我们可以知道父类是在最里面的
//指针需要一点一点上移动
//当然需要最后了
子类构造函数调用父类的析构函数
JAVA初始化顺序
1、调用顺序:
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
其他说明:
2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法
5、类消除时候,首先消除子类部分,再消除父类部分
你这里C继承A,所以顺序是:
A的属性初始化-->A的构造-->C的属性初始化(此时new B()调用了B的构造)-->C的构造
这个就要说说java的类加载机制了。
先介绍就是java的类初始化。这4种情况会类初始化:
遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候,读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。
使用javalangreflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
再介绍下类加载顺序:
父类的静态代码块--->子类的静态代码块-->父类的非静态代码块-->父类构造函数-->子类非静态代码块--->初始化子类构造函数。
这个时候你就会发现为什么子类构造要super了。
super,超类,即父类。当你实例化一个子类的时候,编译器会自动查找子类的父类,并先将父类初始化。
当你的子类使用带参数的构造函数时,你必须保证该子类的父类也有相同的带参数的构造器。
1super(),它用来告诉编译器,爷我用的是哪个型号的构造器,方便你找俺老子。
2super属性,用于访问父类属性或方法。
比如,
public class Father(){
public Father(){}
public Father(String name,String sex){
thisname=name;
thissex=sex;
}
public String name="免贵姓唐";
public String sex;
}
public class Son_1(){
public Son_1()
public Son_1(String name,String sex){
super(name,sex);
}
public String name="真的免贵";
public static void main(String[] arg){
print(supername+" "+name);
}
}
快睡了,思维有点混。不懂hi我好了。568418555,Q我也成。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)