一、继承的基本概念
- 被继承的类称为父类(超类),继承父类的类都称为子类(派生类)
- 继承是指一个对象直接使用另一个对象的属性和方法,但是能继承非私有的属性和方法;
- Java只能实现单继承,即一个类只能有一个父类
- 构造方法不能被继承。
- Protected:受保护的访问权限修饰符,用于修饰属性和方法;也就是专门用于子类继承父类所使用的修饰符;修饰的属性和方法可以被子类继承
- 子类可以直接访问父类中的非私有的属性和行为。
- 通过 extends 关键字让类与类之间产生继承关系。
语法
class 子类 extends 父类 { }
案例
Person类
public class Person {
String name;
int age;
}
Student类
public class Student extends Person {
String school;
}
测试类
public class Test {
public static void main(String[] args) {
Student s = new Student();
// 访问 Person 类中的 name 属性
s.name = "张三";
// 访问 Person 类中的 age 属性
s.age = 25;
// 访问 Student 类中的 school 属性
s.school = "北京";
System.out.println("姓名:" + s.name + ",年龄:" + s.age + ",学校:" + s.school);
}
}
输出:
二、子类对象的实例化过程
执行顺序
1.先执行父类的属性初始化, 再执行父类构造方法
2.执行子类属性初始化, 执行子类的构造方法
如果父,子都有静态资源(静态属性, 静态代码块):
1.先执行父类静态资源,再执行子类静态资源,
2.先执行父类的属性初始化, 再执行父类构造方法
3.执行子类属性初始化, 执行子类的构造方法
静态属性赋值, 静态代码块只执行一次
案例
Person类
public class Person {
String name;
int age;
//父类的构造方法
public Person(){
System.out.println("父类的构造方法");
}
}
Student类
public class Student extends Person {
String school;
//子类的构造方法
public Student(){
System.out.println("子类Student的构造方法");
}
}
测试类
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
输出
三、super关键字
在子类调用父类方法或属性时使用
语法:
super.属性名
super.方法名()
注意:super调用父类的构造方法时,只能防止程序的第一行(要不然会报错)
super和this的区别
super是调用父类的属性和方法
this是调用本类的属性和方法
四、方法重写
如果子类对父类方法的实现不满意, 子类可以重写父类的方法
方法重写前提:
子类重写父类,方法签名与父类方法签名一样: 返回值一样, 方法名一样. 参数列表一样
调用方式:
子类重写父类的方法, 子类对象调用该方法,调用子类重写的方法,
如果子类没有重写父类的方法, 子类对象调用该方法, 调用从父类继承的方法
案例
Monkey类
public class Monkey {
public Monkey(String s){
System.out.println(s);
}
public Monkey(){
}
public void speak(){
System.out.println("咿咿呀呀.......");
}
}
People类
public class People extends Monkey {
public People(String s){
super(s);
}
public People(){
}
@Override
public void speak() {
System.out.println("小样的,不错嘛!会说话了!");
}
public void think(){
System.out.println("别说话!认真思考!");
}
}
测试类
public class Test {
public static void main(String[] args) {
Monkey monkey = new Monkey("我是一只猴子");
monkey.speak();
People people = new People("我是人类Tom");
people.speak();
people.think();
}
}
输出
总结
继承在面向对象编程是十分重要的的,需要牢牢的掌握继承的语法和特点,最最最重要的是继承只能单继承,不能和c++那样多继承.