『壹』 请问java能不能直接用子类初始化父类
其实回答你这个问题挺难的,因为你问的问题本身就是个问题,通过你问的问题,你很多概念其实没有搞清楚...。
首先子类父类的继承性问题是类之间的关系,而初始化是对象的问题(当然类也能初始化,但是这种初始化无关于子类父类,这也不牵扯到你问的问题)。对象是没有父子的问题的,当你实例化一个类的对象出来,这个对象是属于这个类以及这个类的所有父类的,即是说,如果User继承Personnel再继承Object,那么你实例化一个User对象Jone,那么Jone既是User的对象同时也是Personnel的对象同样也是Object的对象,但是这里只有一个对象,没有三个对象,Jone包含三个类的所有特性,包括属性,方法等等。所以当你实例化Jone这个对象以后,它其实已经同时初始化三个类所定义的所有属性。而java机制是从父类到子类初始化的。从这个概念上来讲,实例化一个类的对象出来,那么久必须把这个类的所有父类定义的全部特性全部初始化,而且必须初始化,这不是能不能的问题,是必须这么做。
就目前而言,你对java内部的编译和运行机制不甚了解的情况下,思考这种问题其实无益,你应该更多的着眼于目前的基础知识,很多问题在你了解更多的知识以后这些都不是问题,你现在去想这种似是而非的问题,会让你思维混乱的,因为你这个问题的本身问法就是错的,从一个错误的问题出发,即使别人给你回答,那么怎么回答都是错的,别人需要从很基础的知识一点一点给你讲,大多数人不会浪费这么多时间不会跟你解释的,你要注重自我学习,不要乱提错误的问题。
『贰』 当java父类和子类都有构造函数时,求子类对象初始化过程详解
你好,初始化过程是这样的:
1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
3.其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法;
4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法;
最后,给你个例子吧。你运行着帮助理解。
class Super{
public static int a ;
private int b ;
static{
System.out.println("此时a的值为:" + a) ;
a = 10 ;
}
public Super(){
System.out.println("此时a的值为:" + a) ;
System.out.println("此时b的值为:" + b) ;
b = 20 ;
}
{
System.out.println("此时b的值为:" + b);
b = 30 ;
}
}
class Sub extends Super{
public static int aa ;
private int bb ;
static{
System.out.println("此时aa的值为:" + aa) ;
aa = 10 ;
}
public Sub(){
System.out.println("此时aa的值为:" + aa) ;
System.out.println("此时bb的值为:" + bb) ;
bb = 20 ;
}
{
System.out.println("此时bb的值为:" + bb);
bb = 30 ;
}
}
public class ConstructorTest {
public static void main(String[] args) {
new Sub() ;
}
}
『叁』 java中,子类初始化时一定要调用父类的构造方法,不调用行吗
一定会调用,原因是这样的。
因为子类继承了父类,那么就默认的含有父类的公共成员方法和公共成员变量,这些方法和变量在子类里不再重复声明。如果你初始化子类的时候,不初始化父类,那么你通过子类调用父类方法或变量的时候会出现什么情况呢?当然就是抛异常阿!所以,Java虚拟机会在你初始化子类的时候默认的初始化子类的父类。而且是一层一层的往上递进!