java建构函式能否被继承,为什么?
1个回答
展开全部
java建构函式能否被继承,为什么?
不能,因为子类继承父类的时候,先执行父类建构函式;具体的说就是执行父类时就会先“呼叫”父类的建构函式,注意“呼叫”和继承不是一个含义,实质上是“自动执行”。
继承(extends)的含义其实是“扩充套件”,子类完全没必要扩充套件父类的建构函式,因为反正每次调子类的时候都会“自动执行”它父类的建构函式,如果真的需要子类建构函式特殊的形式,子类直接修改或过载自己的建构函式就好了。
估计是你龚“建构函式”的意义本身不理解,“呼叫”一个类有“继承”和“组合(说白了new 一个类)”两种方式,当你“呼叫”一个类的时候就会“自动执行”它的“建构函式”。
java中,子类能不能继承父类的构造方法??
你老师是对的,不过一下子说不清楚。给你个例子。
class A{
public A(){} 1:无引数构造方法。
public A(String s){} 2.
}
class B extends A{
public B(String s){
super(s); 3.
}
}
说明:如果没有1处的无引数构造方法,那么3处一定要主动呼叫父类带引数的构造方法。
如果有1处的构造方法,那么3处程式码可以不要,因为Java会自动预设呼叫父类的无引数构造方法。
记住一点:在构造子类时,一定会呼叫到父类的构造方法。
所以父阀要么有一个预设的无引数构造,这样Java会自动呼叫这个无引数的构造。如果父类没有无引数的构造,那么就要你自己在子类的构造中,通过super()的方式呼叫父类的构造。
java的继承中的构造方法
java继承中对建构函式是不继承的,只是呼叫(隐式或显式)。
举例说明:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
抚 System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
编译后执行结果如下:
分析:SonClass s = new SonClass(66);
执行这句时,呼叫
public SonClass(int c) {
System.out.println(1234);系统会自动先呼叫父类的无参建构函式(super())
}
在这个建构函式中,等价于
public SonClass(int c) {
super();必须是第1行,否则不能编译
System.out.println(1234);
}
所以结果是 100 1234
在建立子类的物件时,Java虚拟机器首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类物件从所有直接或间接父类中继承的例项变数都被正确地初始化。
3.如果子类建构函式是这样写的
public SonClass(int c) {
super(22);必须是第1行,否则不能编译
显式呼叫了super后,系统就不再呼叫无参的super()了;
System.out.println(1234);
}
执行结果是 22
1234
总结1:建构函式不能继承,只是呼叫而已。
如果父类没有无参建构函式
建立子类时,不能编译,除非在建构函式程式码体中第一行,必须是第一行显式呼叫父类有参建构函式
如下:
SonClass (){
super(777);显示呼叫父类有参建构函式
System.out.println(66);
}
如果不显示呼叫父类有参建构函式,系统会预设呼叫父类无参建构函式super();
但是父类中没有无参建构函式,那它不是不能呼叫了。所以编译就无法通过了。
总结2:建立有参建构函式后,系统就不再有预设无参建构函式。
如果没有任何建构函式,系统会预设有一个无参建构函式。...
建构函式可以继承吗?
建构函式是可以继承的
但是建构函式不能被显示的呼叫的
,由于你的有引数要传递所以要这样呼叫才行
#include
class A
{
public:
A(int &x)
{
s=x;
}
int getS()
{
return s;
}
private:
int s;
};
class B:public A
{
public:
B::B(int x):A(x)
{}
void print()
{
cout<
}
};
void main()
{
B b(2);
b.print();
}
你可以用一个PRINTF语句去测试他们的执行的
java中一个子类是否可以继承父类的构造方法
构造方法不会被继承,当子类例项化时会自行先去找父类构造方法,之后再找自身构造方法。程式码说明(java为例)
父类class person{ public person { 父类构造方法 System.out.println("我是父类无参构造方法"); }}public class student extends person{ public static void main(String[] args) { 例项化student student stu1 = new student(); }}执行上述程式码,在控制台输出:我是父类无参构造方法
关于继承构造方法的问题
子类继承父类的话,当子类被实力化就会去呼叫父类的预设构造方法.这是不可改变的.如果你不想显示这些值,就把预设的构造方法里的程式码都去掉.
另一种情况就是,你在实力化的时候传一些引数进去,就不会呼叫预设的构造函数了.前提是你传的引数要有相应的建构函式来匹配.
如果又想呼叫预设的建构函式的话,就用super();
java中子类不写构造方法而父类写构造方法,子类继承了父类哪个构造方法?
您好,提问者: 太不专业了,构造方法怎么会存在继承?
不写预设的有个隐士的构造方法,举个例子吧:
class A{ void add();}public class B extends A{ public B(){ super(); 这个super也是隐士的。 }}如何知道有个预设的super()呢?看下面程式码class AA{ public AA{ System.out.println("super()"); }}public class BB extends AA{ public static void main(String[] args){ new BB(); 输出super(); }}
继承关系下,构造方法的呼叫规则有哪些?
第一个规则:子类的构造过程中,必须呼叫其父类的构造方法。一个类,如果我们不写构造方法,那么编
译器会帮我们加上一个预设的构造方法,所谓预设的构造方法,就是没有引数的构造方法,但是如果你自己写
了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类物件的时候,肯定呼叫了子类的构
造方法,但是在子类构造方法中我们并没有显示的呼叫基类的构造方法,就是没写,如:super(); 并没有这样
写,但是这样就会呼叫父类没有引数的构造方法,如果父类中没有没有引数的构造方法就会出错。
第二个规则:如果子类的构造方法中没有显示的呼叫基类构造方法,则系统预设呼叫基类无引数的构造方
法注意:如果子类的构造方法中既没有显示的呼叫基类构造方法,而基类中又没有预设无参的构造方法,则编
译出错,所以,通常我们需要显示的:super(引数列表),来呼叫父类有引数的建构函式。
java父类的构造方法为什么不能被子类继承
子类=父类﹢新增的变数﹢新增的方法。物件语言的构造器作用在于对类建立例项物件时完成物件的初始化工作(为变数申请记忆体空间等)
因此,子类川构造器除了承担著初始化子类的新增变数和方法,还要初始化父类自身新增加的变数和方法。一般来说,如果在子类的构造器中没有使用super()呼叫父类相应的构造器,子类的构造器会自动呼叫父类预设的,也就是不带引数的构造器来初始化父类的东西。
而Java类的预设构造器,当你没有为你写的类建造构造器的时候,Java会自动帮你建立这个预设构造器,但是当你自己编写了构造器后,你自己编写构造器将会覆盖掉预设的构造器,就是说预设的构造器不存在。那么这个时候,你在继承的子类里面没有显示新增super()函式呼叫你在父类里编写的父类构造器,子类的构造器将不能自动找到父类的构造器。找不到父类的构造器意味着什么?意味着你的子类例项化的时候找不到父类的构造器来初始化父类的东西,不能完成类例项物件的初始化工作,你说你的子类能不出现错误?!
所以,在子类的构造器中需不需要新增super()呼叫父类相应的构造器,只需要考虑子类的构造器才初始化的时候能不能完成所有变数和方法的初始化就可以了。另外,根据自己初始化工作的需要使用super()呼叫相应的父类构造器来初始化也是有必要的。
所以你所说的子类不能继承父类构造器,这说明你没有显式的呼叫seper(),而且父类构造器被你的子类覆盖或呼叫的父类中没有无参构造器所引起的。
Java继承中的构造方法问题
你好,很高兴为你解答。
这段程式码提示B的建构函式错误。这是因为B继承A,B的建构函式会自动呼叫A的预设建构函式(即不带引数的建构函式),但A没有定义预设建构函式,所以就会报错。有两种改法:
1)在A中增加预设建构函式。如下:
class A {
int a;
String name;
String sex;
A(){ 修改这儿
}
A(int a, String name, String sex) {
this.a = a;
this.name = name;
this.sex = sex;
}
void ShowMess() {
}
}
class B extends A {
int age;
B(int a, String name, String sex, int age) {
this.a=a;
this.name=name;
this.sex=sex;
this.age=age;
this.age = age;
}
void ShowMess() {
System.out.println("a+name+sex+age");
}
}
2)修改B的建构函式,显式地呼叫A的非预设建构函式。如下:
class A {
int a;
String name;
String sex;
A(int a, String name, String sex) {
this.a = a;
this.name = name;
this.sex = sex;
}
void ShowMess() {
}
}
class B extends A {
int age;
B(int a, String name, String sex, int age) {
super(a,name,sex); 修改这儿
this.age = age;
}
void ShowMess() {
System.out.println("a+name+sex+age");
}
}
不能,因为子类继承父类的时候,先执行父类建构函式;具体的说就是执行父类时就会先“呼叫”父类的建构函式,注意“呼叫”和继承不是一个含义,实质上是“自动执行”。
继承(extends)的含义其实是“扩充套件”,子类完全没必要扩充套件父类的建构函式,因为反正每次调子类的时候都会“自动执行”它父类的建构函式,如果真的需要子类建构函式特殊的形式,子类直接修改或过载自己的建构函式就好了。
估计是你龚“建构函式”的意义本身不理解,“呼叫”一个类有“继承”和“组合(说白了new 一个类)”两种方式,当你“呼叫”一个类的时候就会“自动执行”它的“建构函式”。
java中,子类能不能继承父类的构造方法??
你老师是对的,不过一下子说不清楚。给你个例子。
class A{
public A(){} 1:无引数构造方法。
public A(String s){} 2.
}
class B extends A{
public B(String s){
super(s); 3.
}
}
说明:如果没有1处的无引数构造方法,那么3处一定要主动呼叫父类带引数的构造方法。
如果有1处的构造方法,那么3处程式码可以不要,因为Java会自动预设呼叫父类的无引数构造方法。
记住一点:在构造子类时,一定会呼叫到父类的构造方法。
所以父阀要么有一个预设的无引数构造,这样Java会自动呼叫这个无引数的构造。如果父类没有无引数的构造,那么就要你自己在子类的构造中,通过super()的方式呼叫父类的构造。
java的继承中的构造方法
java继承中对建构函式是不继承的,只是呼叫(隐式或显式)。
举例说明:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
抚 System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
编译后执行结果如下:
分析:SonClass s = new SonClass(66);
执行这句时,呼叫
public SonClass(int c) {
System.out.println(1234);系统会自动先呼叫父类的无参建构函式(super())
}
在这个建构函式中,等价于
public SonClass(int c) {
super();必须是第1行,否则不能编译
System.out.println(1234);
}
所以结果是 100 1234
在建立子类的物件时,Java虚拟机器首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类物件从所有直接或间接父类中继承的例项变数都被正确地初始化。
3.如果子类建构函式是这样写的
public SonClass(int c) {
super(22);必须是第1行,否则不能编译
显式呼叫了super后,系统就不再呼叫无参的super()了;
System.out.println(1234);
}
执行结果是 22
1234
总结1:建构函式不能继承,只是呼叫而已。
如果父类没有无参建构函式
建立子类时,不能编译,除非在建构函式程式码体中第一行,必须是第一行显式呼叫父类有参建构函式
如下:
SonClass (){
super(777);显示呼叫父类有参建构函式
System.out.println(66);
}
如果不显示呼叫父类有参建构函式,系统会预设呼叫父类无参建构函式super();
但是父类中没有无参建构函式,那它不是不能呼叫了。所以编译就无法通过了。
总结2:建立有参建构函式后,系统就不再有预设无参建构函式。
如果没有任何建构函式,系统会预设有一个无参建构函式。...
建构函式可以继承吗?
建构函式是可以继承的
但是建构函式不能被显示的呼叫的
,由于你的有引数要传递所以要这样呼叫才行
#include
class A
{
public:
A(int &x)
{
s=x;
}
int getS()
{
return s;
}
private:
int s;
};
class B:public A
{
public:
B::B(int x):A(x)
{}
void print()
{
cout<
}
};
void main()
{
B b(2);
b.print();
}
你可以用一个PRINTF语句去测试他们的执行的
java中一个子类是否可以继承父类的构造方法
构造方法不会被继承,当子类例项化时会自行先去找父类构造方法,之后再找自身构造方法。程式码说明(java为例)
父类class person{ public person { 父类构造方法 System.out.println("我是父类无参构造方法"); }}public class student extends person{ public static void main(String[] args) { 例项化student student stu1 = new student(); }}执行上述程式码,在控制台输出:我是父类无参构造方法
关于继承构造方法的问题
子类继承父类的话,当子类被实力化就会去呼叫父类的预设构造方法.这是不可改变的.如果你不想显示这些值,就把预设的构造方法里的程式码都去掉.
另一种情况就是,你在实力化的时候传一些引数进去,就不会呼叫预设的构造函数了.前提是你传的引数要有相应的建构函式来匹配.
如果又想呼叫预设的建构函式的话,就用super();
java中子类不写构造方法而父类写构造方法,子类继承了父类哪个构造方法?
您好,提问者: 太不专业了,构造方法怎么会存在继承?
不写预设的有个隐士的构造方法,举个例子吧:
class A{ void add();}public class B extends A{ public B(){ super(); 这个super也是隐士的。 }}如何知道有个预设的super()呢?看下面程式码class AA{ public AA{ System.out.println("super()"); }}public class BB extends AA{ public static void main(String[] args){ new BB(); 输出super(); }}
继承关系下,构造方法的呼叫规则有哪些?
第一个规则:子类的构造过程中,必须呼叫其父类的构造方法。一个类,如果我们不写构造方法,那么编
译器会帮我们加上一个预设的构造方法,所谓预设的构造方法,就是没有引数的构造方法,但是如果你自己写
了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类物件的时候,肯定呼叫了子类的构
造方法,但是在子类构造方法中我们并没有显示的呼叫基类的构造方法,就是没写,如:super(); 并没有这样
写,但是这样就会呼叫父类没有引数的构造方法,如果父类中没有没有引数的构造方法就会出错。
第二个规则:如果子类的构造方法中没有显示的呼叫基类构造方法,则系统预设呼叫基类无引数的构造方
法注意:如果子类的构造方法中既没有显示的呼叫基类构造方法,而基类中又没有预设无参的构造方法,则编
译出错,所以,通常我们需要显示的:super(引数列表),来呼叫父类有引数的建构函式。
java父类的构造方法为什么不能被子类继承
子类=父类﹢新增的变数﹢新增的方法。物件语言的构造器作用在于对类建立例项物件时完成物件的初始化工作(为变数申请记忆体空间等)
因此,子类川构造器除了承担著初始化子类的新增变数和方法,还要初始化父类自身新增加的变数和方法。一般来说,如果在子类的构造器中没有使用super()呼叫父类相应的构造器,子类的构造器会自动呼叫父类预设的,也就是不带引数的构造器来初始化父类的东西。
而Java类的预设构造器,当你没有为你写的类建造构造器的时候,Java会自动帮你建立这个预设构造器,但是当你自己编写了构造器后,你自己编写构造器将会覆盖掉预设的构造器,就是说预设的构造器不存在。那么这个时候,你在继承的子类里面没有显示新增super()函式呼叫你在父类里编写的父类构造器,子类的构造器将不能自动找到父类的构造器。找不到父类的构造器意味着什么?意味着你的子类例项化的时候找不到父类的构造器来初始化父类的东西,不能完成类例项物件的初始化工作,你说你的子类能不出现错误?!
所以,在子类的构造器中需不需要新增super()呼叫父类相应的构造器,只需要考虑子类的构造器才初始化的时候能不能完成所有变数和方法的初始化就可以了。另外,根据自己初始化工作的需要使用super()呼叫相应的父类构造器来初始化也是有必要的。
所以你所说的子类不能继承父类构造器,这说明你没有显式的呼叫seper(),而且父类构造器被你的子类覆盖或呼叫的父类中没有无参构造器所引起的。
Java继承中的构造方法问题
你好,很高兴为你解答。
这段程式码提示B的建构函式错误。这是因为B继承A,B的建构函式会自动呼叫A的预设建构函式(即不带引数的建构函式),但A没有定义预设建构函式,所以就会报错。有两种改法:
1)在A中增加预设建构函式。如下:
class A {
int a;
String name;
String sex;
A(){ 修改这儿
}
A(int a, String name, String sex) {
this.a = a;
this.name = name;
this.sex = sex;
}
void ShowMess() {
}
}
class B extends A {
int age;
B(int a, String name, String sex, int age) {
this.a=a;
this.name=name;
this.sex=sex;
this.age=age;
this.age = age;
}
void ShowMess() {
System.out.println("a+name+sex+age");
}
}
2)修改B的建构函式,显式地呼叫A的非预设建构函式。如下:
class A {
int a;
String name;
String sex;
A(int a, String name, String sex) {
this.a = a;
this.name = name;
this.sex = sex;
}
void ShowMess() {
}
}
class B extends A {
int age;
B(int a, String name, String sex, int age) {
super(a,name,sex); 修改这儿
this.age = age;
}
void ShowMess() {
System.out.println("a+name+sex+age");
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询