请问Java能不能直接用子类初始化父类?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问Java能不能直接用子类初始化父类?相关的知识,希望对你有一定的参考价值。
其实回答你这个问题挺难的,因为你问的问题本身就是个问题,通过你问的问题,你很多概念其实没有搞清楚...。首先子类父类的继承性问题是类之间的关系,而初始化是对象的问题(当然类也能初始化,但是这种初始化无关于子类父类,这也不牵扯到你问的问题)。对象是没有父子的问题的,当你实例化一个类的对象出来,这个对象是属于这个类以及这个类的所有父类的,即是说,如果User继承Personnel再继承Object,那么你实例化一个User对象Jone,那么Jone既是User的对象同时也是Personnel的对象同样也是Object的对象,但是这里只有一个对象,没有三个对象,Jone包含三个类的所有特性,包括属性,方法等等。所以当你实例化Jone这个对象以后,它其实已经同时初始化三个类所定义的所有属性。而java机制是从父类到子类初始化的。从这个概念上来讲,实例化一个类的对象出来,那么久必须把这个类的所有父类定义的全部特性全部初始化,而且必须初始化,这不是能不能的问题,是必须这么做。
就目前而言,你对java内部的编译和运行机制不甚了解的情况下,思考这种问题其实无益,你应该更多的着眼于目前的基础知识,很多问题在你了解更多的知识以后这些都不是问题,你现在去想这种似是而非的问题,会让你思维混乱的,因为你这个问题的本身问法就是错的,从一个错误的问题出发,即使别人给你回答,那么怎么回答都是错的,别人需要从很基础的知识一点一点给你讲,大多数人不会浪费这么多时间不会跟你解释的,你要注重自我学习,不要乱提错误的问题。追问
所以说
有两个类
class a;
class b extends a;
在主方法中写
a *c=new b()是可以通过编译的吧?
java语法没有a *c这种方式 java里面没有指针。
a c=new b();是没错的。
当子类被初始化的时候他会先去初始化父类,再初始化子类。
public class Test1231public static void main(String[] args)
B b = new B();
class A
private int a = 123;
public A()
System.out.println(a);
class B extends A
private int b = 234;
public B()
System.out.println(b);
参考一下。
这是父级有无参构造的情况。
那么再写一个我不想调用父级的无参构造,我需要调用他的有参构造
public class Test1231public static void main(String[] args)
B b = new B();
class A
private int a = 123;
public A(int z)
System.out.println(z);
class B extends A
private int b = 234;
public B()
super(b);
System.out.println(b);
赋值兼容原则
在C++中,无论哪种继承方式下派生类都会把父类所有的数据继承,区别在于是否能访问赋值兼容规则如下:
1.可以直接用派生类对象给基类对象赋值
2.可以直接用派生类对象的地址给基类指针赋值
3.可以使用派生类对象为基类的引用直接进行初始化
但该原则不能反向运行,愿意如下:
实例化一个类型时要调动构造方法,而子类在构造前要先构造父类对象,编译器提前开辟出子类加父类总大小的空间。父类成员构造完成后先放入,再把子类成员构造出来加在后面,而继承则是把所有成员放在一起构成子类对象。子类可以给父类赋值是因为子类成员包括了父类成员,赋值时只是用到了和父类相同的空间(称之为对象切片),父类需要什么成员,子类都可以一一提供。而反过来父类做不到提供子类需要的所有的成员。
以上是关于请问Java能不能直接用子类初始化父类?的主要内容,如果未能解决你的问题,请参考以下文章