有A extends B,A没有构造函数,B有无参构造函数,当new A()时,会调用父类函数吗?

如题所述

先小小纠正一下,java里面一般不叫函数,叫方法,这是Java的一个小习惯。

你这个问题原因很简单。

首先,任何类都有构造方法,难怕是你不写,也会默认你有一个有无参构造方法。,所以你的A里面就会有一个叫A()的构造方法。

当你new A()时,默认你有一个有无参构造方法A()的方法里的第一句,会自动加上一个super();的方法,这句就是调用父类构造方法的意思,这是java规定的规则。

你可以尝试一下,在A里写一个构造方法:

A(){

super();   //这个一定要放在第一句

System.out..XX;

}

这与你不写super()这句效果是一样的,因如果没写,java会默认在第一句加上super。

1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;

2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;

3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;

4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;

5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)

6.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。[1] 

7.在Python中构造函数必须通过重写__init__方法实现

温馨提示:内容为网友见解,仅供参考
无其他回答

...extends B,A没有构造函数,B有无参构造函数,当new A()时,会调用父...
当你new A()时,默认你有一个有无参构造方法A()的方法里的第一句,会自动加上一个super();的方法,这句就是调用父类构造方法的意思,这是java规定的规则。你可以尝试一下,在A里写一个构造方法:A(){ super(); \/\/这个一定要放在第一句 System.out..XX;} 这与你不写super()这句效果...

B extends A , A中只有无参构造函数.而B中只有有形参的构造函数 能否运 ...
你可以从继承的角度去理解,既然B extends A这就意味着B是一个A,所以虽然使用的是B专有的构造函数,但是你本来创建的就是一个B的对象,然后B既然是一个A,B自然可以赋值给一个A(实际内存创建的还是一个B对象),但是B的专有特性会被隐藏。

java中子类如何不调用父类的构造方法
如果父类有带参数的构造方法,却没有不带参数的构造方法,那么如果子类没有显式调用父类构造方法,那么编译会报错。如 class A { public A(String name) { } } class B extends A { public B() { \/\/如果不显式调用父类构造方法,编译会报错。} } ...

子类继承父类时,是否只能调用父类的无参构造函数
这个是应该选B,是这样的,在实例化一个子类对象的时候,如果不写SUPER关键字,那么JVM会自动调用父类的无参 构造方法 ,如果需要用到父类的有参构造方法,那么必须用SUPER关键字来传参,不管在什么时候,实例化子类对象的时候都先调用父类的构造方法 ...

java继承时,实例化子类,是否会默认调用父类构造方法
在 Java 中,无论是 explicit 还是 implicit 方式,都要求在子类的构造方法中调用其父类的构造方法。如果父类无构造方法(其实是一个默认无参的构造方法),那么子类的构造方法中会自动进行调用;如果 父类有自己的构造方法(这时父类不会有默认无参的构造方法),那么在子类的构造方法中,必须要调用...

在java中,class A extends B B b=new A 这是多态还是隐式转换?
A a = new B();a虽然是用的B的构造函数,但经过upcast,成为父类对象的实例,不能访问子类的属性和方法。a.i,a.f()是合法的,而a.j,a.g()非法。此时访问a.f()是访问A中的f()=== caiqiupeng的问题,楼主也可以参考一下。A a = new B(); 这条语句,实际上有三个过程:(1) ...

Java 找错
:public A(int x) { } 默认Class B是不能有空构造的,因为A没有提供空构造,如:public A() { } --- 所以错误问题在于构造问题 解决办法很多种,可以给A写一个空的构造函数 也可以给B写一个带有int参数的构造函数 还可以把A的构造函数改写,总之是:构造函数的继承问题!

...论是调用有参构造,还是无参构造, 一定会调用父类的无参构造? 对不...
不是的,如果在子类中显式调用父类的有参构造函数则不会调用父类的无参构造函数 以下是代码,可自己执行实践 include <iostream> using namespace std;class A { public:int a;int b;A(){ cout<<"A Constructed 1\\n";} A(int a,int b){ this->a=a;this->b=b;cout<<"A Constructed...

构造函数的有参和无参的区别,构造函数的参数是派什么用场的?
2.没有参数的构造函数就是默认构造函数。有参数的构造函数可用传递的参数给类中的属性赋初始值或执行初始化操作例如订阅事件等。构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能...

java 子类实例化时是否同时存在一个父类对象.
不会产生父类对象,只是用了父类的构造函数而已,并不是用到构造函数就会产生对象,构造函数只是起对象初始化作用的,而不是起产生对象作用的,如果new A();即只有new语句才会产生父类A的对象。变量是静态绑定 ,方法是动态绑定。 这里面变量在编译期间实现了变量调用语句与变量定义赋值语句的绑定,...

相似回答