Java基础:继承

Posted liumilk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础:继承相关的知识,希望对你有一定的参考价值。

一、访问权限

java中有三个访问权限修饰符private;protected;public和一个默认default(不加修饰符)。

如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则。

字段绝不能是共有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改;可以使用共有的getter和setter方法来替换共有字段。

但是也有例外,如果是包级私有的类或者私有的嵌套类,那么直接暴露成员不会有特别大的影响。

public class AccessWithInnerClassExample {
    
    private class InnerClass{    //私有嵌套类
        int x;
    }
    
    private InnerClass innerClass;
    
    public AccessWithInnerClassExample(){
        innerClass = new InnerClass();
    }
    
    public int getValue(){
        return innerClass.x;
    }
}

二、抽象类与接口

抽象类:

抽象类不一定包含抽象方法,抽象方法一定位于抽象类中;抽象类和普通类的最大区别是:抽象类不能被实例化,需要继承抽象类才能实例化其子类。

接口:

接口的成员(字段+方法)默认都是public的,并且不允许定义为private或者protected;

接口的字段默认都是static和final的(接口中无变量声明,只有常量,因为用了final修饰符);

接口的方法默认都是abstract的,从Java8开始,接口方法也支持default和static修饰,但是使用默认的方法和静态的方法必须有方法体。

public interface InterfaceExample {
    
    default void fun1(){    //默认方法
        //这里是方法体,虽然没有语句
    }
    
    static void fun2(){        //静态方法
        //这里是方法体,虽然没有语句
    }
}

比较:

  • 从设计层面上看,抽象类提供了一种 IS_A 关系,那么就必须满足里氏替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE_A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS_A 关系(接口可以让不相关的类都实现一个方法);
  • 从使用上看,一个类可以实现多个接口,但是不能继承多个抽象类;
  • 接口的字段只能是static和final类型的,而抽象类的字段没有这种限制;
  • 接口的方法只能是public的,而抽象类的方法可以有多种访问权限。

三、super

访问父类的构造函数:可以使用super()访问父类的构造函数,从而完成一些初始化的工作;

访问父类的成员:如果子类覆盖了父类中的某个方法的实现,可以通过使用super关键字来引用父类的方法实现。

四、重写与重载

重写存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法;

重载存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。(返回值不同,其他都相同不算是重载)

以上是关于Java基础:继承的主要内容,如果未能解决你的问题,请参考以下文章

java基础---继承

11. Java基础之继承

Java基础——面对对象-继承

java中封装,继承,多态,接口学习总结

代码笔记Java基础:类的继承(构造器)

java基础第五天_静态代码块类的继承和接口