继承的学习目标:
认识继承;
继承的好处、应用场景
什么是继承?
Java中提供了一个关键字extends,用这个关键字,可以让一个类和另外一个类建立父子关系。
继承的特点:
子类能继承父类的非私有成员(成员变量、成员方法)。
父类的私有成员,子类是不能继承的。而父类的非私有成员,子类是不能继承的。
私有:private
继承后对象的创建:
子类的对象是由子类和父类共同完成的。
A父类:
package cn.ensource.d7_extends;
// 父类
public class A {
public int i;
public void print1() {
System.out.println("===print1====");
}
private int j;
private void print2() {
System.out.println("===print2====");
}
}
B子类:
package cn.ensource.d7_extends;
// 子类
public class B extends A {
private int k;
// 子类可以继承父类的非私有成员方法
public void print3() {
// 1. 访问父类的非私有变量
System.out.println(i);
print1();
// System.out.println(j);
// print2()
}
}
测试类:
package cn.ensource.d7_extends;
public class Test {
public static void main(String[] args) {
B b = new B();
System.out.println(b.i);
// System.out.println(b.j);
// k 变量是私有的,所以不能被访问
// System.out.println(b.k);
b.print1();
// b.print2();
b.print3(); // print3是公开出去的
}
}
继承的执行原理:
私有的变量是不能直接访问的,只能通过getter/setter方法进行访问。
k是私有变量,只能自己访问,k通过B的方法去访问并对外开放。
子类对象实际上是由子父类两张设计图共同创建出来的。
待继承关系的类,java会用类和其父类,这多张设计图来一起创建类和对象。
子类能够访问什么成员,是由子父类这多张设计图共同决定的,这多张设计图对外暴露了什么成员,对象就可以访问什么成员。
继承的好处:
减少重复代码的编写。
感觉Teacher类是不完整的,里面没有name变量,但是创建的对象是由Teacher类和People类共同完成的。虽然name变量是私有的,但是我们可以通过getter、setter 方法来处理。
但是,主要的是我们把重复的代码提取出去了,把重复的代码合并到父类中。这个思维方式很关键。我们在写代码的时候,看到有重复的代码,我们也许一上来不会想到继承的思路,可以通过这种方式来解决的。这个就是继承的好处。
package cn.ensource.d8_extends_application;
public class People {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package cn.ensource.d8_extends_application;
public class Teacher extends People{
private String skill;
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public void printInfo() {
System.out.println(getName() + "具体的技能:" + skill);
}
}
package cn.ensource.d8_extends_application;
public class Test {
public static void main(String[] args) {
// 目标:掌握继承的好处
Teacher t = new Teacher();
t.setName("播仔");
t.setSkill("Java、Spring");
System.out.println(t.getName());
System.out.println(t.getSkill());
t.printInfo();
}
}
运行结果: