继承的概念:
• 当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成
一个公共类,让多个类吸收公共类中已有特征和行为而在多个类型只需
要编写自己独有特征和行为的机制,叫做继承。
• 在Java语言中使用extends(扩展)关键字来表示继承关系。
• 如:
public class Worker extends Person{} - 表示Worker类继承自Person类
其中Person类叫做超类、父类、基类。
其中Worker类叫做派生类、子类、孩子类。
• 使用继承提高了代码的复用性,可维护性及扩展性,是多态的前提条件。
继承的特点:
• 子类不能继承父类的构造方法和私有方法,但私有成员变量可以被继承
只是不能直接访问。
• 无论使用何种方式构造子类的对象时都会自动调用父类的无参构造方法,
来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加代
码super()的效果。
• 使用继承必须满足逻辑关系:子类 is a 父类,也就是不能滥用继承。
• Java语言中只支持单继承不支持多继承,也就是说一个子类只能有一个父
类,但一个父类可以有多个子类。
方法重写的概念:
• 从父类中继承下来的方法不满足子类的需求时,就需要在子类中重新写
一个和父类一样的方法来覆盖从父类中继承下来的版本,该方式就叫做
方法的重写(Override)。
方法重写的原则:
• 要求方法名相同、参数列表相同以及返回值类型相同,从Java5开始允许
返回子类类型。
• 要求方法的访问权限不能变小,可以相同或者变大。
• 要求方法不能抛出更大的异常(异常机制)。
又见构造块与静态代码块(笔试)
• 先执行父类的静态代码块,再执行子类的静态代码块。
• 执行父类的构造块,执行父类的构造方法体。
• 执行子类的构造块,执行子类的构造方法体。
Person.java
/*
编程实现Person 类的封装
*/
public class Person {
//1.私有化成员变量 使用 private 关键字修饰
private String name;
private int age;
//3.在构造方法中调用set方法进行合理值的判断
public Person() {
System.out.println("Person()");
}
public Person(String name, int age) {
System.out.println("Person(String int)");
setName(name);
setAge(age);
}
//2. 提供共有的 get set 方法并在方法中进行合理值的判断
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 0 && age < 150) {
this.age = age;
} else {
System.out.println("年龄不合格哦!!");
}
}
//自定义成员方法实现特征打印
public void show() {
System.out.println("我是" + getName() + ", 今年" + getAge() + "岁了");
}
public void eat(String food) {
System.out.println(food + "真好吃");
}
public void play(String game) {
System.out.println(game + "真好玩");
}
}
Worker.java
/*
自定义Worker 类继承 Person 类
*/
public class Worker extends Person {
private int salary;
//3.在构造方法中调用set方法进行合理值的判断
public Worker() {
super(); //表示调用父类的无参构造方法,若没有写则编译器自动添加
System.out.println("Worker()");
}
public Worker(String name, int age, int salary) {
super(name, age); //表示调用父类的有参构造方法
System.out.println("Worker(String int int)");
//setName(name);
//setAge(age);
setSalary(salary);
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
if(salary >= 2200) {
this.salary = salary;
} else {
System.out.println("薪水不合理哦!!!");
}
}
public void work() {
System.out.println("今天的砖头一点烫手...");
}
//自定义show 方法 覆盖从父类中继承的版本
@Override //注解 注释 ,用于声明下面的方法是对父类方法的重写,若没有构成重写则编译报错
public void show() {
super.show(); //表示调用父类的show 方法
System.out.println("我的薪水是" + getSalary());
}
}
WorkerTest.java
/*
编程实现Worker类测试
Test 类继承 Person 类
*/
public class WorkerTest {
public static void main(String[] args) {
//使用无参方式构造WOrker 类型的对象并打印特征
Worker w1 = new Worker();
//当子类重写show 方法后,则下面调用的是重写之后的版本
w1.show(); //null 0
System.out.println("-----------------------");
//使用有参方式构造Worker 类型的对象并打印特征
Worker w2 = new Worker("zhangfei",30,3000);
w2.show();
//调用成员方法测试
w2.eat("豆芽");
w2.play("王者荣耀");
w2.work();
}
}