java中继承

  • 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
  • 通过关键字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.成员方法 调用父类的成员方法

你可能感兴趣的:(java中继承)