java的继承中子类先调用父类无参构造函数是为了干啥,默认这个无参的构造函数啥也不做,那调用它干啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的继承中子类先调用父类无参构造函数是为了干啥,默认这个无参的构造函数啥也不做,那调用它干啥相关的知识,希望对你有一定的参考价值。

这只是JAVA 中的一个规则,
父类无参数的构造方法不一定什么都不做。
调用他是JDK的事,你不必理会,知道他会这样做就可以,避免冲突。比如说:父类无参数的构造方法 输出了个什么,子类你在输出个一样的 就冲突了。
参考技术A 这个是规范,只有先调用了默认的无参构造器才能为下面的覆盖默认构造器的方法做铺垫。可能有地方说的不对请谅解。 参考技术B 因为你构造一个子类对象的时候,必须先构造一个父类对象,这在逻辑上也是对的,没有父亲,哪来的儿子。父类子类都只是定义了,并没有真实的对象。即使默认的构造函数并没没有初始化一些属性,但是也构造父类对象了。
调用父类的有参构造参数是为了初始化子类对象继承了父类对象的属性,子类继承了父类,有可能会对父类属性的部分做出改变,那没改变的部分在子类的构造函数里没法初始化,就只能靠父类的构造函数了。
参考技术C 由于父类的参数定义域内一般不会对参数赋初值,当创建没有参数的父类对象时,有必要对其内部的参数进行初始化,所以父类的无参构造函数内部可能对一些参数进行了初始化工作。
子类的构造器中提供的参数可能只是所有参数的一部分的值,若不先调用父类的无参构造函数,则很可能有些重要的参数没有进行初始化赋值,在子类的其他方法进行操作时会出现严重的错误。
所以有必要调用一次父类的无参构造函数。本回答被提问者采纳
参考技术D 任何类都提供一个无参构造,是一个JAVA程序员的良好习惯
关于继承么,有父亲才能有儿子吧,,,
你怎么知道无参构造函数怎么也不做??

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

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
}


}
}

以上是关于java的继承中子类先调用父类无参构造函数是为了干啥,默认这个无参的构造函数啥也不做,那调用它干啥的主要内容,如果未能解决你的问题,请参考以下文章

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

Java语言中的继承

继承中子类构造函数相关问题

java基础知识总结

JAVA:子类继承父类时的构造方法

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