构造函数在继承中的作用(关于C#中构造函数的继承的问题)

本文目录
- 关于C#中构造函数的继承的问题
- C#中构造函数的作用
- 关于java中子类继承父类的构造方法
- java抽象类中的构造方法作用如何理解
- c++中为什么对继承过来的基类成员初始化的工作也要由派生类的构造函数承担
- java里面抽象类的构造函数有什么用
关于C#中构造函数的继承的问题
1、构造函数不继承,派生类会自动调用基类构造函数。
2、若类内没有定义构造函数,系统会自动隐式生成一个不带参数的构造函数,比如定义一个类:
public class A
{
}
可以理解为它已经存在一个如下的构造函数
public class A
{
public A()
{
}
}
3、派生类构造函数自动调用基类的不带参数的构造函数,注意下面的格式
public class B:A
{
public B()
{
}
}
相当于
public class B:A
{
public B():base()
{
}
}
3、基类中带参数的构造函数必须显式调用,比如:
public class A
{
public A()
{
}
public A(string str)
{
}
}
public class B:A
{
public B():base("aaa")
{
}
}
C#中构造函数的作用
共同点:
都是实例化对象,初始化数据的
默认构造是说所有的类都从祖先object那继承了空参的构造方法,你不写与写空参构造都存在,而有参数的构造一般是自己写的,写就有不写就没有,它的作用和空参的一样,只是它里面可以有参数,给你个例子来说明吧
有一个类Monitor它有属性String height;String
width
public Monitor(){}
public Monitor(String height,String width){}
有一个空参的一个有参的构造的方法
在main方法里我做初始化动作
Monitor monitor=new Monitor();
这个构造只是把显示器这个对象创造出来了,它的属性就没有值,也可以再手动给它赋上值
如:monitor.height=100;
monitor.width=200;
用有参的就不一样了,少很多事
Monitor monitor2=new Monitor("100","200");
在这里我只要把想放进去的参数直接放进去就能给我的属性赋上值,是不是省了很多事?
这就是它的优势!
回答完结!
关于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
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:创建有参构造函数后,系统就不再有默认无参构造函数。
如果没有任何构造函数,系统会默认有一个无参构造函数。
java抽象类中的构造方法作用如何理解
/*学好java基础,学深java基础,才能走的更远(为什么呢?百度有更好的解释),愿我们共同探讨学习,用通俗易懂的话语来了解java
1.抽象类也是类,只不过本身不能实例化,要通过子类实例化。
2.是类就有构造方法,如果我们没有给出构造方法,系统将自动提供一个无参构造方法,如果我们给出了构造方法,系统将不会提供。
那么问题来了,为什么非得有构造方法呢?
构造方法(函数)的作用:(1)用于创建对象,初始化参数;(2)接受子类传来的参数,初始化参数,子类堆内存的某块位置存放父类的初始化参数
那么问题又来了,问题1:抽象类有构造方法怎么不能创建对象?问题2:它与接口又有什么关系呢?
问题1:请看构造函数的作用,还要补充下,用抽象类就要写个继承它的子类,然后通过父类引用指向子类这也是多态的表现,Father f = new Son();引用地址f就可以调用抽象类中的一般方法;
那么问题又来了抽象类怎么访问子类的方法呢?好了,自己考虑去
对于抽象类和一般类,接口来个例子
话说我去兰州拉面馆吃面,拿着菜单
抽象类的说法:
我:老板来碗面
老板:你需要什么面?
我:就是面啊?----------》描述抽象,既然抽象类都这么抽象了,那它有什么作用呢?简单来 说,就是抽取某个类的共性功能,方便分类调用(编程就需要逻辑思维清晰,可读性强,就像书为什么要目录);举个例子,假如有哥们想吃面,想吃辣点的(面的共性辣),就快速选个方向去四川面馆,到了面馆就有查渣面,鸡丝凉面(具体类)选择...
老板:...
类的说法:
我:老板来碗面
老板:你需要什么面?
我:油泼面 ------------》描述具体
接口:从广义的角度讲对外提供规则的都是接口,来个例子
话说你家大门锁,你可以用匹配的钥匙打开锁,可我不一定非得要用你那型号的钥匙去开你家大门,我可以用铁丝就可以了,想想,实际生活中当真可以么,去问盗贼,他们"接口"倒是学的不赖
为什么用铁丝也可以开门呢?因为实现了锁孔内几个顶针同时顶上然后什么什么的方法,现在我们来看,我们可以用钥匙这个对象可以开锁,用铁丝这个对象开锁,他们共同的特点就是实现了
开锁的一些规则要求,也就是实现了开锁的要求的方法
需要说明的是:接口是没有构造方法的,它只是用来对外提供规则,其他类都可以实现这个接口,重写里面的方法
问题2:抽象类和接口的关系?
一般类继承抽象类,extends
一般类也可继承一般类 -----》类与类可以继承,单继承,儿子和父亲的关系(一个儿子不能来自两个父亲的基因,能吗?)
一般类和抽象类可以实现一个或多个接口,implements---》....干儿子和干爹的关系
那么问题来了:有没有人有个奇葩的问题,接口可不可以有父亲?干爹呢?
......收住,回到正题
3.子类中所有的构造方法默认都会访问父类中空参构造方法--》为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据,
所以,子类初始化之前,一定要先完成父类数据的初始化。
4.那么问题来了,要是父类没有无参构造呢?
不会有人认为父类没构有造方法吧?。。。
系统会默认加的(前面有提到),这里是指父类手动写了有参构造,子类继承也要手动写出构造方法(请看下面例子)
5.继承的注意事项
(1):子类只能继承父类所有非私有的成员(成员方法和成员变量)---》皇帝老儿的妃子,你太子能继承享用,恩...只代表大众的想法,特殊的除外,不钻牛角尖
(2):子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
*/
/* 1.父类没有无参构造方法,子类怎么办?
super解决
this解决
2.注意事项
super(…)或者this(….)必须出现在构造方法的第一条语句上
*/
class test{
public static void main(String args) {
Son son = new Son("张三",23);
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name="李四";//姓名
int age=24;//年龄
/*public Father() {//空参构造
System.out.println("Father 空参构造");
}*/
public Father(String name,int age) {//有参构造
//super(); 系统默认的,你知道是继承谁的吗? 最高父类Object
this.name = name;
this.age = age;
}
public void setName(String name) {//设置姓名
//super(); 系统默认的,你知道是继承谁的吗?最高父类Object
this.name = name;
}
public String getName() {//获取姓名
return name;
}
public void setAge(int age) {//设置年龄
this.age = age;
}
public int getAge() {//获取年龄
return age;
}
}
class Son extends Father {
//String name = "张三";
//int age=23;
/*public Son() {//由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age); //注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23);//这种方法可以,为什么?因为它会在本类中寻找有参构造,通过 super(name,age)将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age); //同上
super("李四",24);//同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}
public Son(String name,int age) {
//super(name);
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,age);
System.out.print(name+":"+age);
}
}
// 子类构造方法另外种写法对吗?
class test{
public static void main(String args) {
Son son = new Son("王五");
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name;//姓名
int age;//年龄
/*public Father() {//空参构造
System.out.println("Father 空参构造");
}
*/
public Father(String name,int age) {//有参构造
//super(); 系统默认的,你知道是继承谁的吗? 最高父类Object
this.name = name;
this.age = age;
}
public void setName(String name) {//设置姓名
//super(); 系统默认的,你知道是继承谁的吗?最高父类Object
this.name = name;
}
public String getName() {//获取姓名
return name;
}
public void setAge(int age) {//设置年龄
this.age = age;
}
public int getAge() {//获取年龄
return age;
}
}
class Son extends Father {
//String name = "张三";
//int age=23;
/*public Son() {//由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age); //注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23);//这种方法可以,为什么?因为它会在本类中寻找有参构造将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age); //同上
super("李四",24);//同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}*/
public Son(String name) {//我们说子类不继承父类的构造方法,也可以这样写对吗?
//super(name);
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,24);
System.out.print(name+":"+age);
}
}
//就写这么多吧,不断的为什么,我都要疯了,有错误的和遗漏的希望指正
c++中为什么对继承过来的基类成员初始化的工作也要由派生类的构造函数承担
瞧你这话说得!!
子类从基类继承来的变量在基类构造函数中可以初始化,在子类构造函数中也可以初始化!
在子类构造对象时,首先要调用基类的构造函数,再调用子类的构造函数;
子类对继承来的变量:
1.初始化:那么可想而知,最终构造子类对象时子类对这个变量的初始化起了作用(因为先基类构造函数对其初始化,后子类构造函数对其初始化,明白吧);
2.不初始化:那么可想而知,子类不干初始化这变量的事了,所以基类构造函数的初始化就发挥了作用。
总之,一句话,记住构造子类对象时,构造函数调用的顺序:始终是先调用基类构造函数,再调用子类构造函数,其他衍生出来的问题仔细想想就明白了!!
如果解决了你的疑惑,请采纳!否则请追问!加油哦!
java里面抽象类的构造函数有什么用
除了不能用来初始化之外,和普通类的构造函数没有区别。
它所起的作用和父类的构造函数在子类的调用中起的作用是一致的。
一些初始化时的公共流程可以在父类抽象类的构造函数中放置,子类调用通过super关键字调用即可。

更多文章:
linux显示最近执行的命令(如何查看linux服务器运行状态)
2026年4月16日 06:15
scum2022作弊码大全(人渣武器代码是什么 人渣武器代码介绍)
2026年7月24日 14:45
横向多条件求和(怎样在Excel 中 编写横向 多条件求和公,至少同时满足2个条件,再对指定的行区域进行求和)
2026年5月16日 11:45
carrytakebring的区别(bring, take, carry的区别是什么)
2026年1月25日 23:30
static局部变量和全局变量(请用自己的话解释全局变量与局部变量的区别,静态变量与自动变量的区别)
2025年7月24日 21:00
在线随机数生成器在哪找到的(1~33选6个数组合找什么软件)
2026年2月1日 14:45
phparray可以遍历数组吗(PHP 遍历多维数组,获取指定的值)
2026年8月16日 22:00
21探戈中控显示屏出现update(如何升级车载中控显示器)
2026年8月26日 02:45
使用多线程打开文件什么意思(怎么理解多线程,为什么要用多线程)
2026年2月3日 02:00
java string属于什么类型(java string是什么类型)
2025年12月2日 20:15
js的removechild(js,html5,css3.求js里面的remove()方法如何使用)
2025年6月19日 14:45













