一、继承的概述:
1、面向对象的三大特征:封装性、继承性、多态性。
2、继承是多态的前提,如果没有继承,就没有多态。
3、继承主要解决的问题就是:共性抽取。
4、继承关系中的特点:
(1)子类可以拥有父类的“内容”;
(2)子类还可以拥有自己专有的内容;
(3)继承关系具有传递性。若类C继承类B,类B继承类A,则类C拥有从类B继承的属性与方法,也拥有从类A继承的属性和方法,还能定义新的属性和方法。
(4)具有多种继承形式。①多重继承,即理论上一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性和方法。②单继承,即一个子类只能有唯一的一个父类。 Java出于安全性和可靠性考虑,类之间仅支持单继承,通过接口机制实现多重继承。
二、继承的格式:
Java通过extends关键字实现继承。
定义子类【语法格式】 继承
class 子类名 extends 父类名{
//类体
}
定义父类格式:一个普通的类定义。
例子:
package com.jsu.tmy;
//定义一个父类,员工
public class Employee {
public void method(){
System.out.println("方法执行!");
}
}
package com.jsu.tmy;
//定义了一个员工的子类,讲师
public class Teacher extends Employee{
}
package com.jsu.tmy;
//定义了员工的另一个子类,助教
public class Assistant extends Employee{
}
package com.jsu.tmy;
public class Main {
public static void main(String[] args) {
//创建了一个子类对象
Teacher teacher = new Teacher();
//Teacher类当中虽然什么都没写,但是会继承来自父类的method方法。
teacher.method();
Assistant assistant = new Assistant();
//Assistant类当中虽然什么都没写,但是会继承来自父类的method方法。
assistant.method();
}
}
Main方法的运行结果:
三、成员变量的访问
在父类的继承关系当中,如果成员变量重名,则创建子类对象时,有两种访问方式:
①直接通过子类对象访问成员变量;
创建子类对象时,等号左边是谁,就优先用谁,没有则向上找父类的。
②间接通过成员方法访问成员变量。
该方法属于谁(定义在父类中还是子类中),就优先用谁,没有则向上找。
package com.jsu.tmy;
public class ExtendsField {
public static void main(String[] args) {
Fu fu = new Fu(); //创建父类对象
System.out.println(fu.numFu); //只能使用父类的东西,没有任何子类内容
System.out.println("=========");
Zi zi = new Zi(); //创建子类对象
System.out.println(zi.numFu); //10
System.out.println(zi.numZi); //20
System.out.println("=========");
//等号左边是谁,就优先用谁
System.out.println(zi.num);
System.out.println("=========");
//这个方法是子类的,优先使用子类的,没有再向上找
zi.methodZi(); //200
//这个方法是在父类中定义的
zi.methodFu(); //100
}
}
public class Fu {
int numFu = 10;
int num = 100;
public void methodFu() {
//使用的是本类当中的num,不会向下找子类的
System.out.println(num);
}
}
package com.jsu.tmy;
public class Zi extends Fu{
int numZi = 20;
int num = 200;
public void methodZi() {
//因为本类当中有num,所以这里用的是本类的num
System.out.println(num);
}
}
运行结果:
四、变量重名;
当变量重名时若要使用 局部变量 ----> 直接写成员变量名
本类的成员变量---->this.成员变量名
父类的成员变量---->super.成员变量名
package com.jsu.tmy;
public class ExtendsField {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}
}
package com.jsu.tmy;
public class Fu{
int num = 10;
}
package com.jsu.tmy;
public class Zi extends Fu {
int num = 20;
public void method(){
int num = 30;
System.out.println(num); //30, 局部变量
System.out.println(this.num); //20, 本类中的成员变量
System.out.println(super.num); //10, 父类的成员变量
}
}
运行结果;