继承
继承: 面向对象的三大特征之一。类是用来描述事物的,而继承描述的是事物之间的所属关系。
1.所属关系?
如果两个类,可以用(is-a)关系描述,比如:有个动物类和小牛类,我们不能说动物是小牛,但是却可以说小牛是动物,此时,这两个类之间就有了所属关系,类之间形成一种关系体系。
2.这种关系是什么?
动物类说的宽泛,小牛类是其中一种具体的动物类,小牛类中有动物类的属性和行为(比如,动物都有名字,动物都会休息,小牛也会,其他很多动物都会),小牛类有动物类的属性和行为,我们称这种关系为继承关系。
3.继承?
子类共享父类所有的属性和行为。除了父类的私有成员,我们可以通过父类中提供的get,set方法访问。
父类:也叫基类,超类。 子类:也叫派生类。
4.具体怎么做?
先知道有哪些类,类中有哪些属性和方法,再抽取共同的属性和方法,形成父类。子类除了具有父类的基本属性和方法外,还可以有自己特有的方法和属性。子类由子类重新定义父类的成员和子类特有的成员组成。
注意:子类继承父类,需要关键字extends 格式为:子类名 extends 父类名{ }
5.当类之间有了继承关系后,子类或父类成员变量有什么影响?
·成员变量如果不重名,就正常调用执行。
·如果变量重名,程序该怎么调用?
首先,对象,或方法可以调用成员变量。
其次,如果通过子类对象访问成员变量,等号左边对象名是什么类型,就访问哪个类的成员变量;如果是成员方法访问成员变量,那么方法在哪个类中,就访问哪个类的成员变量。
最后,如果找到了就调用,如果没有找到就向父类中找。
6.如果确定了需求,子类就要调用父类成员变量,怎么办?
如下代码:可见子类方法中用了super关键字。
1 class Fu{ 2 int num = 10; 3 } 4 class Zi extends Fu{ 5 //重新定义父类的成员变量 6 int num = 20; 7 //子类特有的方法 8 public void show(){ 9 System.out.println("需要父类的成员变量:"+super.num); 10 System.out.println("子类的成员变量:"+num); 11 12 } 13 }
7.那么各类成员方法在调用时有什么影响?
·子类和父类成员方法不重名,调用没有影响(先在子类中查找,找到就用,没有找到就去父类找此成员方法)
·如果重名(方法声明一样):就说明子类重新定义了父类的方法,称为方法重写(Override)。
重写的要求:子类重写的方法的修饰符范围要大于等于父类,此方法出现的异常必须比父类的更小,更少。
因为本来方法重写就是为了满足更多的需求,父类方法的更新、扩充,肯定不能写的比父类的还不好。
注意:其实在团队开发中,拿到别人的代码,如果自己想要修整,是不能在源代码上改动的,就可以使用方法重写,程序调用时,即继承了他们的方法,没有改动,还扩展了他的功能,满足更多的需求。
8.那么构造方法会怎么样?
首先,子类继承父类后,怎么就自动继承了父类的成员呢?那是因为内存中父类空间优先于子类对象产生,即在每次创建子类对象时,系统会先初始化父类空间,再创建子类对象。
其次,代码是按顺序执行的,哪一行代码做了加载父类空间的事情呢?其实在子类构造方法中的第一行,系统默认添加了一句代码,super();我们知道this()是调用无参构造方法,这个super()也是调用了父类的无参构造方法,这时加载了父类空间。
最后,我们看到子类继承父类后,共享到父类成员。
注意:子类每个构造方法的第一行都有super();
浙公网安备 33010602011771号