子类可以同时继承父类的有参构造函数和无参函数吗,继承了无参函数还会再继承有参函数吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子类可以同时继承父类的有参构造函数和无参函数吗,继承了无参函数还会再继承有参函数吗?相关的知识,希望对你有一定的参考价值。

不会。子类的构造方法中默认调用父类的无参构造方法。如:public 子类() super(); .......... super()这句可以省略不写,但不能说没有。
当要调用父类的有参构造函数时,此时子类构造方法须显式写明 super(参数),无参的将会被替换。
理解不了,记住一点:.子类的构造方法,需将父类的构造方法写到第一句。如果同时调用无参和有参,将不满足此条件。(第一句)
调用父类有参和无参的解决办法:父类的构造方法可以重载,子类的当然也可以,把子类构造方法第一句换了就行。
注意:本人觉得不能用“继承”这个字眼,应该是调用。为什么?因为子类继承父类,只是继承其公有的属性和方法。私有的,构造继承不过来。
参考技术A 定义的Sub的无参构造方法需要调用父类的无参构造方法。把子类Sub的无参构造方法注释掉,那就正确了。证明了子类显示调用父类带参构造函数时,系统还会自动调用父类的无参构造函数是正确了. 参考技术B 我用的C# 不会继承构造方法. 但是子类是可以调用的

面向对象:继承抽象类抽象方法虚方法

1、继承
什么是继承?
目的:代码重用
public class 子类:父类
{

}
父类 基类 被继承的类
子类 派生类 需要继承的类

父类构造函数的继承
创建子类对象时,先调用父类构造函数,再调用子类构造函数
默认调用父类无参构造函数
如果子类有无参构造函数,要求父类也有无参构造函数
如果调用父类的有参构造函数,显式用base调用


public 子类(参数列表)base(实参)
实参:要调用的父类的有参构造函数的参数列表{}


base:父类对象(父类实例)

2.抽象
abstract

抽象方法:访问修饰符 abstract 返回类型 方法名(参数);

抽象方法只是行为的声明,没有方法体,没有具体实现
抽象方法必须在抽象类中定义
抽象方法必须在非抽象子类中实现

抽象类:访问修饰符 abstract class 类名{}

抽象类可以包含抽象方法,和非抽象方法(实现方法,虚方法)
抽象类不能实例化
抽象类中的抽象方法必须在非抽象子类中实现
抽象类通常会被继承(通常在抽象类中写抽象方法只是为了声明一下子类中要实现的方法,方法体写在子类中的重写的方法中)

重写方法:访问修饰符 override 返回类型 方法名(参数){方法体}
子类对父类方法的改写
当重写父类中的方法时要保证方法的签名必须保持一致


3.虚方法:
virtual

继承 重写 定义的位置


实现方法 可以继承 不能重写 任何地方
抽象方法 可以继承 必须重写 抽象类中
虚方法 可以继承 可以重写 除静态类、密封类之外

 

3.装箱与拆箱

装箱:值类型转换成Object类型或者此值类型所实现的任何接口类型的隐式转换(一定能成功)
操作:在堆中分配一个对象实例,将该值复制到新的对象中(会多占用内存,影响性能)
例子:int i=10;

隐式装箱(可以是隐式的也可以是显式的)
object obj=i;
显示装箱
obj=(obj)i

拆箱:从Object类型到值类型或者此值类型实现的接口类型的隐式转换(不一定成功)
例子:隐式拆箱
int n=(int)obj

装箱拆箱规则:任何值类型都能装箱/拆箱不一定成功
装箱拆箱缺点:影响程序性能


练习:定义形状类,包含计算面积的方法,分别定义一个圆类和矩形类,添加需要的属性和构造函数

代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 继承抽象类和装箱拆箱
{
public abstract class Shapcs//父类
{
public abstract double Sum();
}
public class Yuan : Shapcs
{
public double r;
public Yuan(double r)
{
this.r = r;
}
public Yuan() { }
public override double Sum()
{
return Math.PI * r * r;
}
}
public class Ju : Shapcs
{
public double sid;
public double hid;

public Ju(double sid,double hid)
{
this.sid = sid;
this.hid = hid;
}
public Ju() { }
public override double Sum() {

return sid * hid;
}

}
}

Main方法中调用的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace 继承抽象类和装箱拆箱
{
class Program
{
static void Main(string[] args)
{
#region 重写 抽象方法 计算圆和矩形的面积
Yuan y = new Yuan(2.6);
Console.WriteLine(y.Sum());
Ju j = new Ju(5, 6);
Console.WriteLine(j.Sum());
Console.ReadKey();


//Cat ca = new Cat();
//ca.Eat();
//ca.Sleep();
//Console.ReadKey();
//#endregion
}


}
}

以上是关于子类可以同时继承父类的有参构造函数和无参函数吗,继承了无参函数还会再继承有参函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

构造函数的有参和无参的区别,构造函数的参数是派啥用场的?

面向对象:继承抽象类抽象方法虚方法

Child extends Parent,可以得到什么?

子类的每个构造方法调用父类的构造方法吗

java(面向对象)中,子类如何调用父类的构造方法?分别从无参和有参角度

java构造函数