一、继承概述:
多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需在定义这些属性和行为,只需要继承那个类即可。
多个类可以称为子类,单独这个类称为父类或者超类,基类等。
子类可以直接访问父类中的非私有的属性和行为。
通过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、在子父类中,成员的特点体现。
1、成员变量
2、成员函数
3、构造方法
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();
}
}
2、成员函数
当子父类中出现成员函数一模一样的情况,会运行子类的函数。
这种现象,称为覆盖操作。这时函数在子父类中的特性。
函数两个特性:
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();
NewPhone p = new NewPhone();
p.show();
p.call();
}
}
当子父类中出现成员函数一模一样的情况,会运行子类的函数。
这种现象,称为覆盖操作。这时函数在子父类中的特性。
函数两个特性:
1,重载。同一个类中。overload
2,覆盖。子类中。覆盖也称为重写,覆写。override
覆盖注意事项:
1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。
2,静态只能覆盖静态,或被静态覆盖。