- 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
- 通过关键字extends就可以实现;
- 单独的这个类称为父类,基类或者超类;这个类可以称为子类或者派生类。
- 有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员;
package cn.manman.com;
class Student {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
}
class Teacher{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
}
通过观察上一段代码,我们发现代码的复用性很低,无论你的职位是什么,只要是人,都得吃饭,那么是不是老师可以利用学生的特征,提高代码的复用性呢?
package cn.manman.com;
public class person {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
}
首先我写了一个person类,不管你的职业是什么,都要吃饭,所以给了一个吃饭的方法。
package cn.manman.com;
public class Student {
public static void main(String[] args) {
stu s=new stu();
s.eat();
s.study();
}
}
class stu extends person{
public void study(){
System.out.println("学习");
}
}
然后我接着写了一个学生类,学生在上面基本类的基础之上,还要学习,我利用java里面的继承,这样吃饭的代码就不用再次出现,这样就提高了代码的复用性,无论要写一个工人类还是老师类,都可以继承我的person类。
继承的好处和弊端
- 好处:
提高了代码的复用性
提高了代码的维护性
让类与类之间产生了关系,是多态的前提; - 弊端:
类的耦合性增强了;
开发的原则本来是:低耦合,高内聚;
耦合:类与类之间的关系
内聚:就是自己完成某件事情的能力;
继承的特点
- java只支持单继承,不支持多继承;
- 但是可以多层继承;
继承的注意事项
- 子类 只能继承父类所有非私有的成员(成员方法和成员变量)
package cn.manman.com;
public class jicheng {
public static void main(String[] args) {
Son son=new Son();
son.show();
//son.method();//不可以继承
}
}
class Father{
private int num=10;
public int num1=20;
private void method(){
System.out.println(num);
System.out.println(num1);
};
public void show(){
System.out.println(num);
System.out.println(num1);
};
}
class Son extends Father{
}
子类不可以继承私有的方法;
- 子类不能继承 父类的构造方法,但是可以通过super关键字去访问父类的构造方法
- 不要为了部分功能而去继承
继承中成员变量的关系
通过前面的学习,我们知道类的组成是:成员变量,构造方法,成员方法;但是我们现在学习了继承,我们来思考一下,类的组成部分的各自关系是什么?
- 继承中成员变量的关系
1、子类中成员变量和父类中的成员变量名称不一样
2、子类中成员变量和父类中的成员变量名称一样时,遵循 就近原则;
package cn.manman.com;
//继承中成员变量的关系
public class leiguanxi {
public static void main(String[] args) {
Son1 son=new Son1();
son.show();
}
}
class Father1{
public int num=10;
}
class Son1 extends Father1{
public int num=40;
public int num2=20;
public void show(){
System.out.println(num);
System.out.println(num2);
}
}
接下来看,我想输出局部范围和成员范围的num,我们可以通过使用关键字this
package cn.manman.com;
//要求是:不仅要输出局部范围的num,还要输出成员变量num
public class leiguanxi {
public static void main(String[] args) {
Son1 son=new Son1();
son.show();
}
}
class Father1{
public int num=10;
}
class Son1 extends Father1{
public int num=40;
public void show(){
int num=20;
System.out.println(num);
System.out.println(this.num);//this就代表的是成员变量的num
}
}
如果我还想在子类中输出父类的变量,可以使用关键字super
package cn.manman.com;
//要求是:不仅要输出局部范围的num,还要输出成员变量num
public class leiguanxi {
public static void main(String[] args) {
Son1 son=new Son1();
son.show();
}
}
class Father1{
public int num=10;
}
class Son1 extends Father1{
public int num=40;
public void show(){
int num=20;
System.out.println(num);
System.out.println(this.num);//this就代表的是成员变量的num
System.out.println(super.num);//super就是代表父类变量的num
}
}
- this和super的区别:
this代表的本类中对应的引用
super代表父类存储空间的标识(可以理解为父类的引用,可以操作父类的成员) - this和super的用法
1、调用成员变量:
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
2、调用构造方法
this(...) 调用本类的构造方法
super(...) 调用父类的构造方法
3、调用成员方法
this.成员方法 调用本类的成员方法
super.成员方法 调用父类的成员方法