基本概念
在现实生活中,继承表示的意思是下一代人继承下一代人的财产,换一种理解方法就是上一代人的财产进行再“使用”。而java中继承也有这一特点
如上图,继承就是,当我们发现对象2拥有和对象1相同的变量和方法时,如果我们再去定义一遍就会十分麻烦。这时候我们可以只定义一个对象3,将对象3包含上述这些变量和方法,这样对象3就成为了一个父类,而对象1和2就是子类,相当于从父类那里“继承”了变量和方法,这里的变量和方法就相当于财产。
使用继承的优点也很明显,这样可以大量减少重复性代码,即提高了代码的复用性。
定义格式
public class A extends B {}
A为子类,B为父类。
当类与类之间存在共性(相同)内容,并满足子类是父类中的一种,就可以考虑使用继承。
继承特点
(1)java只支持单继承,不支持多继承,但支持多层继承
理解:一个儿子可以有一个爸爸,不能有多个爸爸,但是儿子也可以爸爸。在java中,爸爸的爸爸不叫爷爷,而是称作间接父类,而爸爸称为直接父类
(2)如果没有写继承于哪个父类,java虚拟机会自动默认为继承于object类
(3)子类能继承父类中的问题:
非私有 | 私有(private) | |
构造方法 | 不能 | 不能 |
成员变量 | 能 | 能 |
成员方法 | 能 | 不能 |
访问特点
成员变量的访问特点
public class guanjianzi {
public static void main(String[] args) {
Zilei m = new Zilei();
m.test();
}
}
class Fulei{
String name = "Fulei";
}
class Zilei extends Fulei{
String name = "Zilei";
public void test(){
String name = "What";
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
输出结果:
What
Zilei
Fulei
- name输出的是离得最近的变量
- this.name输出的是成员变量
- super.name输出的是父类中的变量
总结一下,先在局部位置查找,再在本类成员位置查找,最后在父类成员中查找
super关键字在我的另外一篇博客中有介绍
成员方法的访问特点
就近原则:谁离我近就调用谁
构造方法的访问特点
- 父类中的构造方法不会被子类继承,但可以通过super()进行调用
- 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己
调用父类构造方法——子类构造方法会默认调用父类无参构造,即隐含第一行是super();如果想调用有参构造,必须在子类中手动写super进行调用。调用格式:
super(参数1,参数2)//这两个参数都是父类带参构造中的参数
方法的重写
当子类继承父类中的方法时,如果父类的方法不能满足子类现在的需求,那么这时候就需要对这些方法进行改变,即“重写”。在重写的子类方法前,要加一个@Override。例如:
class Fulei{
public void test(){
String name = "Fulei";
System.out.println(name);
}
}
class Zilei extends Fulei{
@Override
public void test(){
String name = "What";
System.out.println(name);
}
}
注意事项:
- 重写方法的名称、形参列表必须与父类中的一致
- 子类访问权限必须大于等于父类
- 子类返回值类型必须小于等于父类
- 子类不能重写父类的静态方法和私有方法
所以重写的方法尽量和父类保持一致
注意重写和重载的区别