继承:
定义:子类继承父类的属性,使得子类对象具有与父类相同的属性和行为。子类可以直接访问父类中的非私有的属性和行为。
好处:1.提高了代码的复用性。2.使类与类之间产生了关系,是多态的前提。
1.继承的格式:
通过exends 关键字,可以声明一个子类继承另一个父类。
定义格式如下:
public class 父类{
}
public class 子类 extends 父类{
}
演示代码如下:
/*
* 定义员工类Employee,做为父类
*/
class Employee {
String name; // 定义name属性
// 定义员工的工作方法
public void work() {
System.out.println("尽心尽力地工作");
}
}
/*
* 定义讲师类Teacher 继承 员工类Employee
*/
class Teacher extends Employee {
// 定义一个打印name的方法
public void printName() {
System.out.println("name=" + name);
}
}
/*
* 定义测试类
*/
public class ExtendDemo01 {
public static void main(String[] args) {
// 创建一个讲师类对象
Teacher t = new Teacher();
// 为该员工类的name属性进行赋值
t.name = "小明";
// 调用该员工的printName()方法
t.printName(); // name = 小明
// 调用Teacher类继承来的work()方法
t.work(); // 尽心尽力地工作
}
}
2.继承后成员变量的特点:
如果成员变量不重名,则这时的访问不会出现任何影响。
如果子类与父类的成员变量重名了,这时访问的是子类的成员变量。
这时就需要使用super关键字,修饰父类成员变量。 使用格式:super.父类成员变量名
演示代码如下:
//父类
public class Fu {
String s = "我是父类的成员变量";
}
//子类
public class Zi extends Fu{
String s = "我是子类的成员变量";
public void show() {
System.out.println(super.s);
System.out.println(s);
}
}
//测试类
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
演示结果:
我是父类的成员变量
我是子类的成员变量
3.继承后成员方法特点
如果子类父类出现不重名的成员方法,这时调用时没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若没有则执行父类。
如果子类与父类中出现了重名的成员方法时,这时访问怎会出现一种特殊的情况,叫做方法重写。
方法重写:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或复写。声明不变,重写实现。
重写的好处:在原有的父类的基础上拓展出自己独有的功能。
简单的代码示例:
//父类
public class Fu {
public void show() {
System.out.println("我是父类的成员方法");
}
}
//子类
public class Zi extends Fu{
public void show() {
super.show();
System.out.println("我是子类的成员方法。");
System.out.println("我可以比父类更健壮!");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
演示结果:
我是父类的成员方法
我是子类的成员方法。
我可以比父类更健壮!
注:这里重写时,用到super.父类成员方法,表示调用父类的成员方法。
重写的注意事项:
1.子类方法覆盖父类方法,必须保证权限不小于父类权限
2.子类方法覆盖父类方法,返回值类型,方法名和参数列表都要一模一样。
4.继承后构造方法的特点
1.构造方法名与类名是一致的,所以子类无法重写子类构造方法。
2.构造方法的作用是初始化成员变量的,所以子类的初始化过程中必须先执行父类的初始化动作。子类的构造
方法中默认有一个super();表示调用父类的构造方法。
代码如下:
//父类
public class Fu {
public Fu() {
System.out.println("父类构造方法");
}
}
//子类
public class Zi extends Fu{
public Zi() {
//super();默认调用父类构造方法
System.out.println("子类的构造方法");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
演示结果:
父类构造方法
子类的构造方法
5.super和this
super:代表父类的引用
this:代表 当前对象的引用
super和this的用法:
1.访问成员
this.成员变量 ---- 本类的
super.成员变量 ----- 父类的
this.成员方法名() ---- 本类的
super.成员方法名() ----- 父类的
2.访问构造方法
this(...) --- 本类的构造方法
super(...) --- 父类的构造方法
注:super()和this()都必须在构造方法的第一行,所以不能同时出现。
Java中只支持单继承,不支持多继承,但是支持多层继承。