继承
继承的定义
类和类之间具有关系,这种关系被称为关联。如:一个百货公司类和销售员类就是一个关联,学生类和教师类也是一个关联。两个类之间的关系有很多(依赖,组合等),继承只是其中的一种。
-
继承的本质是对某一类的抽象,从而实现对现实世界更好的建模。
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类、超类)。子类继承父类,使用关键字extends来表示
extends的意思是“扩展”,子类是父类的扩展
父类就是(所有子类)共性抽取
public class Zi extends Fu{
//内容
}
继承的注意
- 类与类之间只有单继承,没有多继承!!!
一个子类只能“直接”继承一个父类,就像人只有一个亲生父亲
而父类可以有多个子类,就像一个父亲可以有多个孩子
- 父类中的属性和方法可以被子类继承,而子类同时可以有自己专属的内容
- 在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
a. 直接通过子类对象访问成员变量:
等号左边是谁,就优先用谁,没有则向上找。
b. 间接(在方法中)通过成员方法访问成员变量:
该方法属于谁,就优先用谁,没有则向上找。 - 在父子类的继承关系当中,创建子类对象和父类重名时,谁的就是谁的,子类没有时会向上找父类,永远不会向下找子类。
super关键字
子类继承父类之后,在子类中可以使用this来表示访问或调用子类中的属性或方法,使用super就表示访问或调用父类中的属性和方法。
super的使用
- 访问父类当中的属性
public class Fu {
String name="xxx";
}
public class Zi extends Fu{
String name ="yyy";
public void showname()
{
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
- 访问父类当中的方法
public class Fu {
public void show()
{
System.out.println("唱唱歌");
}
}
public class Zi extends Fu{
public void show()
{
System.out.println("跳跳舞");
}
public void show_together()
{
show();
this.show();
super.show();
}
}
- 调用父类当中的构造
public class Fu {
}
public class Zi extends Fu{
//编译通过,编译器会赠送一个无参构造
//super();
public Zi(){
}
}
//一定是先调用父类构造,后执行子类构造
注意事项
- 用super调用父类构造方法,必须是构造方法中的第一个语句。
- super只能出现在子类的方法或者构造方法中。
- super 和 this 不能够同时调用构造方法。(因为this也是在构造方法的第一个语句)
super和this的区别
- 代表事物不一样
this:代表所属方法的调用者对象
super:代表父类对象的应用空间
- 使用前提不一样
this:在非继承前提下也可以使用
super:只能在继承的条件下才能使用
- 调用构造方法
this:调用本类的构造方法
super:调用父类的构造方法
方法重写
重写(override)
为什么要重写?
子类继承父类,继承父类当中的方法,但是父类中的方法并不一定能满足子类中的功能需要,所以子类中需要把方法重写。
- 在继承关系中,方法名称一样,参数列表也一样。也叫:覆盖,覆写
- 方法重写只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被重写.
- 静态方法不能重写
a. 父类的静态方法不能被子类重写为非静态方法,编译会出错
b. 父类的非静态方法不能被子类重写为静态方法,编译会出错
c. 子类可以定义与父类的静态方法同名的静态方法(但是这个不是覆盖
私有方法不能被子类重写,子类继承父类后,是不能直接访问父类中的私有方法的,那么就更谈不上重写了。
//编译通过
//只是两个类自己的私有方法
public class Fu {
private void show() {
}
}
public class Zi extends Fu{
private void show() {
}
}
重写的语法
- 方法名必须相同
- 参数列表必须相同
- 访问控制修饰符可以被扩大,但是不能被缩小
public > protected > default > private
范围:
public----哪里都可以
protect----同包/子类(子类可以是不同包下的)
default—同包
private-----同类
注:一般情况下,重写的方法会和父类中的方法的声明完全保持一致,只有方法的实现不同。(也就是大括号中代码不一样)
- @Override:写在覆写代码前面,用来检测是不是有效的正确覆盖重写 。
- 抛出异常类型的范围可以被缩小,但是不能被扩大。
ClassNotFoundException --> Exception - 返回类型可以相同,也可以不同,如果不同的话,子类重写后的方法返回类型必须是父类方法返回类型的子类型
例如:父类方法的返回类型是Person,子类重写后的返回类可以是Person也可以是Person的子类型。