面对对象-(继承)

本文详细介绍了Java中的继承概念,包括单继承、继承的好处、何时定义继承以及子父类中成员变量、成员函数和构造函数的特点。强调了覆盖操作在函数重写中的作用和注意事项,同时探讨了构造函数在子类实例化过程中的角色。
摘要由CSDN通过智能技术生成

一、继承概述:

  多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需要继承那个类即可。

多个类可以称为子类,单独这个类称为父类或者超类,基类等。

子类可以直接访问父类中的非私有的属性和行为。

通过extends关键字让类与类之间产生继承关系。

例如: class B extedns A {  }

 

二、继承的好处?

1、提高了代码的复用性。

2、继承的出现让类与类之间产生了关系,提供了多态的前提。

Java中只支持单继承。不直接支持多继承,但是对c++中的多继承提供了改良。

单继承:一个类只能有一个父类。类似于一个儿子只能有一个父亲。

多继承:一个子类可以有多个直接父类(java中不允许,进行改良)

              不直接支持,因为多个父类中有相同成员,会产生调用的不确定性。在Java中是通过“多实现”的方式来体现。

Java支持多层(多重)继承

C继承B,B继承A时,就会出现一个继承体系。

1、查看该体系的顶层类,了解该体系的基本功能。

2、创建体系中的最子类对象,完成功能的使用。

三、什么时候定义继承呢?

当类与类之间存在着所属关系的时候,就定义继承。xxx是yyy中的一种。xxx extends yyy

所属关系: is a 的关系。

class Demo
{
    void show1(){}
}
 
 
class DemoA extends Demo
{
//    void show1(){}
    void show2(){}
}
class DemoB extends Demo
{
//    void show1(){}
    void show3(){}
}

四、子父类中成员变量的特点。

  1、在子父类中,成员的特点体现。

(一)、成员变量

(二)、成员函数

(三)、构造方法

(一)、成员变量

当本类中的成员和局部变量同名时用this区分

当子父类中的成员变量同名用super关键字区分父类。

this和super的用法很相似。

this :代表一个本类对象的引用。

super: 代表一个父类空间


class Fu
{
    private int num = 4;  //继承中不能定义为private,虽然下面定义了函数可以访问,但实
                              //际开发中不允许此类写法。
 
    public int getNum()
    {
        return num;
    }
}
 
 
class Zi extends Fu
{
    private int num = 5;
 
 
    void show()
    {
        System.out.println(this.num+"....."+super.getNum());
    }
}
 
 
class ExtendsDemo2 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi();
        z.show();
    }
}

   (二)、成员函数

当子父类中出现成员函数一模一样的情况,会优先运行子类的函数。
这种现象,称为覆盖操作。这是函数在子父类中的特性。
函数两个特性:
    1,重载。同一个类中。overload
    2,覆盖。子类中。覆盖也称为重写,覆写。override
    
覆盖注意事项:
1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。 
2,静态只能覆盖静态,或被静态覆盖。

3、覆盖的应用:当子类需要父类的功能,而子类中又有自己特有的方法时,可以重写父类方法,这样既沿袭了父类方法,又定义了子类特有的内容。

class Fu
{
    public static  void show()
    {
        System.out.println("fu show run");
    }
}
 
class  Zi extends Fu
{
    public static void show()
    {
        System.out.println("Zi show run");
    }
}
 
class ExtendsDemo3 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi();
        z.show();
 
    }
}

 

当子父类中出现成员函数一模一样的情况,会运行子类的函数。
这种现象,称为覆盖操作。这时函数在子父类中的特性。
函数两个特性:
    1,重载。同一个类中。overload
    2,覆盖。子类中。覆盖也称为重写,覆写。override
    
覆盖注意事项:
1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。 
2,静态只能覆盖静态,或被静态覆盖。
 

(三)构造函数

 子父类中构造函数的特点。

 在子类构造对象时,发现访问子类的构造函数时,父类的构造函数也执行了。为什么?

     子类构造函数中第一行有一个默认的隐式语句。super();

子类的实例化过程:子类中所有的构造函数会默认的访问父类中的空参构造函数。

 为什么子类实例化过程的时候要访问父类的空参数构造函数?

   那是因为子类继承了父类,获取了父类的属性,在使用父类内容之前,要先去父类中看是如何初始化父类属性的。所以子类在实例化过程中必须要访问父类中的构造函数。为了子类必须访问父类的空参构造函数,必须在子类的第一行加上super();默认有

如果父类中没有定义空参构造函数,那么子类狗造函数中必须用super(); 明确要调用父类中的哪个构造函数。

如果子类中有this 调用了当前构造函数时,那么super(); 就没有了,因为this 和super() 只能存在子类构造函数的第一行。两个都只能存在第一行,所以两个只能存在一个。但是可以保证的是,子类中肯定会有其他构造函数去访问父类的构造函数。

注意:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。
————————————————
版权声明:本文为CSDN博主「真香号」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhanshixiang/article/details/81239626

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值