一,什么是继承?
顾名思义,继承就是子承父。当多个类有共同的属性或者方法行为时,可以将这些共同点提出来,放到一个单独的类中,那么许多类只需要继承一个单独的就行了。
这样我们可以把单独的类看作父,拥有相同属性的许多类看作子。
Java的继承:
1.单继承的,一个子类只能有一个直接父类
2.Java中可以多级继承
3.一个父类可以有多个子类
二,作用好处。
共性抽取(抽取相同的属性或方法)提高代码的复用性。
三,既然是子承父的关系,那么他们之间肯定有一定的关系。
继承中的构造方法在这种关系下有一些特殊的访问特点。
1,在子类的构造方法中,如果什么都没有写,则默认赠送super();意思是调用父类的无参方法(括号里可以有参数)。
可以看到,我们右边测试类调用子类的方法时,输出是的确是父类的方法。
这是为什么呢?其实这是因为子类的方法里有个隐藏的"super();"
我们验证一下:
2,所以我们在构建子类的无参构造方法时,不管我们写不写super();子类都必须一定会调用父类的构造,默认用的是无参构造。
那如果是有参的构造方法还会赠送吗?答案是不会,看例子:
我们在父类中构建了有参无参两种方法,然后用子类调用父类的有参方法,最后赋值输出的时候发现,只调用了有参的方法。没有调用父类的无参方法,因为我们之前试过没有写调用super();他会默认调用,这次居然没有调用,就说明子类的方法里是没有调用无参的super();。那如果我们写上呢?想知道的小伙伴可以试试看。这里的答案是如果我们手动写上super();他就会调用父类的无参了。
3,this关键字的用法
this.访问本类成员变量;
this.访问本类成员方法();
this(参数);只能调用本类的其他构造方法,不能调用自己(即不能递归调用,不能在一个构造方法中通过this直接或间接调用该构造方法本身)
例如:
class Test {
Test () { this (1) ; }
Test ( int a) { this () ; }
Test ( int a, int b) { this (1, 2) ; }
}
Test()方法中调用了test(int)构造方法而Test(int)构造方法又调用了Test()构造方法,构成递归调用。Test(int, int)中调用了自身,也构成了递归调用。这三种方法的写法都是错误写法。
其他注意事项
只能写在构造方法中
1.只能是第一个语句
2.super();也必须是第一个语句
所以this()这种形式和super()这种形式不能同时存在
显示的写了this(),则不再默认赠送super();