继承是面对对象编程的三大特性之一,通过继承,可以降低代码的重复率,提高编程开发效率。
继承的特点
- 子类不能继承父类的构造方法(因为构造方法要与类名相同)
- 子类不嫩继承父类的私有方法(因为私有方法只能在本类内部使用),但私有成员变量可以被继承只是不能被直接访问
- 无论使用何种方法构造子类的对象都会自动调用父类的无参构造方法,来初始化继承中的成员变量。(相当于在构造方法的第一行增加代码super()的效果)
- 一定是先调用父类的构造方法,再调用子类的构造方法。
下面拿person类和worker类以及其继承关系来具体举例
person类
public class Person {
//私有化成员变量,即封装,避免在类外对其的意外改变
private int age;
private String name;
//在构造方法中调用set方法,保证成员变量初始化的值是合理的
public Person(int age, String name) {
setAge(age);
setName(name);
}
//无参构造函数
public Person() {
}
//get、set方法
public int getAge() {
return age;
}
//年龄设置时,为了避免出现合法但不合理的值的出现,要对变量进行限制,年龄一般在0-150岁之间
public void setAge(int age) {
if(age>0&&age<150) {
this.age = age;
}else
System.out.println("年龄不合理!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 自定义成员方法实现吃饭行为的模拟 // ctrl+shift+/ 快捷键实现多行注释
*/
public void eat(String food){
System.out.println(food+"真好吃");
}
public void play(String game){
System.out.println(game+"真好玩");
}
public void show(){
System.out.println("我的年龄:"+age+" 我的名字:"+name);
}
}
worker类继承person类,并对person类中的成员方法进行重写
public class Worker extends Person{
private int salary;
public Worker() {
super(); //表示调用父类的无参构造方法 super()必须放在第一行
}
public Worker(int age, String name, int salary) {
super(age, name); //表示调用父类的有参构造方法
setSalary(salary) ;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
if(salary>2200) {
this.salary = salary;
}else
System.out.println("薪资不合理");
}
//从父类继承下来的方法不满足子类的需求时,
// 就需要在子类中重写一个和父类一样的方法来覆盖从父类中继承下来的版本
// 该方式就叫做方法的重写。(override)
public void show(){ //show方法的重写
super.show(); //表示调用父类的show()方法
System.out.println("工人的薪水是:"+salary);
}
public void work(){
System.out.println("正在搬砖");
}
}
personworker的实现类 ,在main方法中看看测试其继承关系
public class PersonWorkerTest {
public static void main(String[] args) {
Person person=new Person(18,"张飞");
Worker worker=new Worker(20,"关羽",2800);
worker.eat("香蕉");
worker.play("王者荣耀");
worker.work();
worker.show();
person.show();
}
}
运行结果: