子类父类中类成员(变量、函数、构造函数)的特点

子父类出现后,类成员的特点:

 

类中成员:

1、变量

2、函数

3、构造函数

 

1、变量

如果子类中出现非私有的同名的成员变量时,

子类要访问本类中的变量,用this关键字

子类要访问父类中的同名变量,用super关键字

 

super和this的使用几乎一致

this代表的是本类对象的引用

super代表的是父类对象的引用

 

如果子类和父类有相同名称的变量时,子类继承父类后,在子类中默认使用的是自己的变量,

因为在子类中是this.num省略了this。如果要用父类的变量只需要在变量前加上super

 

2、函数

当子类出现和父类一模一样的函数时,子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖了一样。

 

这种现象是函数的另一种特性:重写(覆盖)

 

当子类继承父类,沿袭了父类的功能到子类中,但是子类虽然具备该功能,但是功能的内容却和父类不一致

这个时候没有必要重新在子类中定义新功能,只需要重写父类的方法,代码如下:

class Fu
{
    void show
    {
        System.out.println("Fu");
    }
}
class Zi extends Fu
{
    void show
    {
        System.out.println("Zi");
    }
}

class Zi中的方法show就是重写了class Fu中的show

 

 

覆盖需要注意的:

1、子类覆盖父类,必须要保证子类权限大于等于父类权限,才可以覆盖,否则编译失败

2、静态只能覆盖静态

 

函数重载与重写的区别

重载:只看函数名的参数列表

重写:子父类方法要一模一样

 

3、子父类中的构造函数

在对子类对象初始化时,父类的构造函数也会运行,因为子类构造函数的第一行都有一条隐式语句super();

super();会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();

 

为什么子类一定要访问父类中的构造函数

因为父类中的数据子类可以直接获取,所以子类在建立时。需要先查看父类是如何对这些数据进行初始化的

访问父类中的构造函数可以手动定义super语句的方式来定义

 

注意:super语句一定要定义在子类构造函数的第一行,并且不能和this();同时出现

 

子类实例化的过程

结论:

子类的所有的构造函数,默认都会访问父类中空参数的构造函数

因为子类的所以构造函数第一行都有一句隐式的super();语句

当父类中没有空参数的构造函数时,子类必须手动通过super语句的形式来指定要访问父类中的构造函数

子类的构造函数第一行也可以使用this来访问本类中的构造函数,因为子类中至少会有一个构造函数访问父类的构造函数

class  ExtendsDemo
{
    public static void main(String[] args) 
    {
        Zi z = new Zi();
    }
}
class Fu
{
    Fu()
    {
        System.out.println("Fu");
    }
}
class Zi extends Fu
{
    Zi()
    {
        //隐式存在super();
        System.out.println("Zi");
    }
}

上述代码运行后结果为

Fu

Zi

 

this();和super();为什么不能同时存在?

因为他们都只能存在于构造函数里面的第一行

为什么都要写第一行?   因为初始化动作要先做


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,子类构造函数可以在初始化列表中初始化类的成员变量。 在C++中,当子类构造函数被调用时,首先会调用父类构造函数来初始化父类成员变量。这是通过在子类构造函数初始化列表中调用父类构造函数来完成的。 下面是一个示例,演示如何在子类构造函数中初始化父类成员变量: ```cpp #include <iostream> class ParentClass { public: int parentValue; ParentClass(int value) : parentValue(value) { std::cout << "ParentClass constructor called with value: " << parentValue << std::endl; } }; class ChildClass : public ParentClass { public: int childValue; ChildClass(int parentValue, int childValue) : ParentClass(parentValue), childValue(childValue) { std::cout << "ChildClass constructor called with parent value: " << parentValue << " and child value: " << childValue << std::endl; } }; int main() { ChildClass obj(10, 20); return 0; } ``` 输出结果: ``` ParentClass constructor called with value: 10 ChildClass constructor called with parent value: 10 and child value: 20 ``` 在这个示例中,我们有一个父类ParentClass和一个子类ChildClass父类有一个成员变量parentValue,子类有一个成员变量childValue。在子类构造函数中,我们使用初始化列表来调用父类构造函数,并传递相应的参数。这样,父类成员变量parentValue会被正确地初始化。 希望这个示例对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值