欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基础:(四)继承

程序员文章站 2022-07-11 09:36:50
一、访问权限 java中有三个访问权限修饰符private;protected;public和一个默认default(不加修饰符)。 如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则。 ......

一、访问权限

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关键字来引用父类的方法实现。

四、重写与重载

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

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