面向对象的三大特征:
封装性、继承性、多态性
继承性是多态的前提下,没有继承就没有多态。(后期会有多态相关的更新)
- 继承性主要的作用(可以解决的问题):
可以提取出多个类中的共同的特性,从而减少代码量,提高开发效率。例如:老师类和学生类中,都有学习、吃饭、睡觉等行为,所以可以将这些共有的特性提取出来,而这些行为都是人所必需的的,所以可以将这些行为放入一个“人”的类中,让老师和学生都来继承人类的这些行为。
继承的特点:
- 子类可以拥有(继承)父类的内容
- 子类也可以拥有自己专有的内容
定义格式:
public class Person { //父类
//代码块
}
public class Teacher extends Person { //子类1
//代码块
}
public class Student extends Person { //子类2
//代码块
}
- 继承实现:
public class Person {//父类
String name = "中国人";
public Person() { ///构造函数
}
public void study(){
System.out.println("人要学习");
}
}
public class Teacher extends Person { //子类1
String name = "北京人";
public Teacher() {
}
}
public class Main {
public static void main(String[] args) {
Person man = new Person(); //创建父类对象
man.study(); ///调用父类成员方法
Teacher teacher = new Teacher(); //创建子类对象
teacher.study(); //调用子类成员方法
如上图所示,第一条输出为用父类对象调用父类的成员方法;第二条输出是用子类调用子类的成员方法,但是子类中没有定义study成员方法,但是子类还继承了父类的成员方法,所以实际上是子类继承父类的成员方法所得到的结果。
成员变量重名
如上代码可以发现,父类有一个成员变量“name”,而子类也有一个成员变量“name”,并且子类又继承了父类的内容,那么怎么区分父类和子类的同名成员变量呢?
访问成员变量
首先我们要明确如何访问成员变量,这里有两种常用的方法:
- 直接通过对象访问成员变量。
Person man = new Person();
System.out.println(man.name);
2. 间接的通过成员方法访问成员变量。
public void study(){
System.out.println(this.name);
System.out.println("人要学习");
}
如上代码,在Person的成员方法中添加一行访问成员变量的代码。
Person man = new Person();
man.study();
在主函数中调用Person类的成员方法。
有了上述的调用方法,则同名的情况下只需理清思路即可。
-
父类和子类存在同名成员变量,则可通过各自的对象直接访问。
(对象名.成员变量) -
可以通过各自的成员方法访问成员变量。但是注意一点:若子类没有成员方法,则继承父类的,而父类成员方法中访问的是父类的成员变量,所以要想通过子类对象访问父类的成员变量,则可通过此特点实现。
-
通过子类访问父类的成员变量还有一种常用方法。
public void teach(){
System.out.println(super.name);
}
如上图,子类中的成员方法调用父类的成员变量。(super.成员变量名)
- 在上述代码中可以发现this关键字。它用于成员方法访问本类的成员变量。
(this.成员方法名)