为什么需要使用继承?
- 有时候两个类中会有一些相同的属性和方法,他们是相关联的,比如学生和大学生,要是每次都一个个重新定义,就会有很多重复代码,效率肯定也不高,而且这样定义的类是独立的,为了提高代码的重用性,提高程序的扩展性,就有了继承机制。
很明显可以看出,继承是对于有包含关系的两个类而言。例如:学生包含了大学生、高中生… 即被包含的类去继承包含它的类,即较高级,更细节化的类去继承比较基础的类。Java中称被继承的较基础的类为父类,又叫超类或基类;继承的类成为子类,又叫派生类。
Java中的继承
1.语法格式
- Java继承的关键字:extends 格式:
public class 类名(子类、派生类、超类) extends 类名(基类、父类) {
//代码
}
注意:Java中不支持多重继承!
2.子类继承到了父类的哪些属性和方法?
子类继承到了父类中所有的属性和方法,并且子类中可以定义父类没有的属性和方法
public、protected、默认的、private这四个访问修饰符是用来限制属性和方法在什么样的情况下可以使用,具体情况如下:
访问修饰符 | 同类中 | 同包中 | 不同包中 | 不同包但是有继承关系的子类中 |
private | 可以 | 不可以 | 不可以 | 不可以 |
默认的 | 可以 | 可以 | 不可以 | 不可以 |
protected | 可以 | 可以 | 不可以 | 可以 |
public | 可以 | 可以 | 可以 | 可以 |
3.关于方法重写
什么是方法重写
- 在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
什么时候需要方法重写
- 学生类中有一个学习课程的方法
学生的子类大学生类也有一个学习课程的方法
那么学生和大学生的学习方法是否一致呢?
学生的子类高中生类也有一个学习课程的方法
那么学生和高中生的学习方法是否一致?
学生的子类小学生类也有一个学习课程的方法
那么学生和小学生的学习方法是否一致?
方法重写的条件
- 1.必须要存在继承关系。
- 2.子类重写方法时,方法的访问修饰符可以大于或者等于父类方法的访问修饰符。
- 3.子类重写方法时,方法的返回值类型,方法名,参数个数都必须要和父类完全一致。
重写之后如何调用方法呢?
- 根据new关键字后的类名来决定调用谁的方法。如果new关键字后的类名是子类的,那么你实例化对象就是子类的,此时调用方法就会优先调用子类中定义的方法,如果子类中没有才会调用父类中的方法。
4.关于自动转型
什么是自动转型?
- 顾名思义,自动转型指的就是使用时自动的将自身的类型进行转化。
使用自动转型的条件
- 必须要存在继承关系。
自动转型的格式:
- 父类名 对象名 = new 子类构造方法(参数值,…);
- 格式二:
• public void method(父类名 参数名){
}
子类名 对象名a = new 子类构造方法(参数值,…);
父类名 对象名b = new 子类构造方法(参数值,…);
method(对象名a);
method(对象名b);
自动转型的问题
- 无法调用子类特有的方法。
引入这个问题的原因是Java的编译机制所引起的,Java在编译时是根据文件进行编译的。也就是说在编译过程中,Java会使用对象名的类型进行编译。将之后所有的方法和属性都去父类中查找,如果存在则通过编译,如果不存在则编译报错。
运行是将程序运行在内存中,子类的对象以及父类的对象都会存在在内存中,这时候对象名存储的就是子类对象所在的内存空间首地址;当你调用方法时,如果子类存在就调用子类内存空间中的方法,如果子类不存在就去父类的内存空间中调用…