今下午跟着菜鸟教程学习了一下Java的面向对象,由于之前学习过C++,所以有些地方还是很容易理解的。
继承的概念这里不多说,网上有很多讲解的。但是枯燥的文字不如图片实际点。
动物分为食草动物和食肉动物。为什么会分类?因为食草动物和食肉动物有各自的特性(比如食草、食肉)。但是还是从动物这一大类划分出来的,为什么?因为食草动物和食肉动物一些属性又是相同的(比如吃饭)。也就是说动物这一父类比较通用,因为它只规定了吃饭,但是具体吃什么没有规定;食草动物和食肉动物这两个子类就比较具体了,规定了吃的是什么。以此类推,吃的到底是什么,又可以衍生出很多子类。
在Java中继承用到extends和implements这两个关键字。在Java中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类(区别于C++),所以extends只能继承一个类。使用implements关键字可以变相的使Java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号隔开)。
在C++中,子类的构造函数是这么写的。
class animal{
public:
animal(int a,int b){
...
}
}
class fish:public animal{
public:
fish():animal(1,2){
...
}
}
在Java中,由于上述代码中,父类的构造器带有参数,则必须在子类的构造器(也就是C++中的构造函数)显示地通过super关键字调用父类的构造器并配以相应的参数列表。
代码如下:
class fish extends animal{
fish(){
super(1,2);
...
}
}
这里涉及到两个问题:
① super和this关键字的区别
② 构造器相关问题
我们一个一个的来解决,首先来看第一个问题,上面也已经说过了,这里在说一下吧。super表示使用它的类的父类,通过super语句可以调用父类的构造方法或父类的方法。注意的是,super语句必须是子类构造方法的第一条语句,不能在子类中使用父类构造方法名来调用父类构造方法,调用父类的构造方法的唯一途径是使用super关键字。
this关键字表示当前对象,指向自己的引用。
第二个问题,构造器问题。上面也讲了一些,如果调用父类的构造方法的话,需要用到super关键字。
下面说一下构造原则:
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。
4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,用super关键字。
好了,继承就讲到这,睡完午觉继续更。。。