一、继承概述:
多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需要继承那个类即可。
多个类可以称为子类,单独这个类称为父类或者超类,基类等。
子类可以直接访问父类中的非私有的属性和行为。
通过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语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。
————————————————
版权声明:本文为优快云博主「真香号」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/zhanshixiang/article/details/81239626