重载和重写 抽象类和接口

重载和重写

重载

重载是指在一个类中,有两个或多个重名的方法,这些方法参数的类型,数量,顺序有一个是不同的,此时就是方法的重载。返回值类型相同,不能根据返回值类型进行判断是否重载。

重写

重写是指在父子类中,子类中有和父类方法名,参数类型和个数相同时,那么该方法就是子类对父类方法的重写。

对比

重载:

  • 方法名称相同,参数类型,个数,顺序不同
  • 不要求方法的访问范围
  • 应用在一个类方法内部

重写:

  • 要遵寻两同两小一大

    两同:指方法名和参数列表相同
    两小:指子类方法的返回值类型以及声明异常比父类的小(或一样)
    一大:子类中重写方法的访问修饰符比父类的方法的大(或一样)

  • 应用在父类和子类中

抽象类和接口

抽象类是对源头的抽象,抽象的是:是什么。
接口是对行为的抽象,抽象的是:干什么。

抽象类

  1. 抽象类是指用abstract修饰,它的内部可以是抽象方法,也可以是非抽象方法
  2. 有构造方法且不能多继承,不能实例化。
  3. 抽象类中的抽象方法只有方法体,没有具体实现。
  4. 子类继承抽象类后,如果没有实现父类的所有抽象方法,那么子类也是一个抽象类,不能实例化。

接口

  1. 接口是指用interface修饰的,它的内部都为抽象方法。
  2. 可以多实现,且不能实例化。无构造方法。
  3. 接口中的基本数据类型都是public static final的,而抽象类不是。
  4. 接口中不能包含实例域和静态方法(静态方法必须要实现,而接口中的方法都是抽象方法,没有方法体)(但java8之后加入了静态方法)

public static final变量原因:(且默认static final,不需显示声明)
因为接口可以多实现,通过static修饰,该变量可以被任何地方使用,类似一种全局变量,如果实现类需要用到的话。
接口是体现一种标准化,规范化的作用,如果不用final修饰,那么实现类都可一对其进行修改,违反了规范化的原则。即禁止实现类修改它。

java8接口新特性

  1. 可以有静态方法,但必须实现它,且不能被重写。
interface Method{
//    int pp();
    static void printM(){
        System.out.println("print");
    }
}

static 存在的目的是可以通过类名直接调用,所以不能重写的原因是如果一个类实现了多个接口,且这些接口有同名,同参的静态方法,那么实现类不知道要去调用那个接口的静态方法,所以java不允许使用"实现类.接口静态方法"的方式调用接口,而是使用"接口.接口的静态方法"的方式。Method.printM();,实现类中可以定义和接口同名同参的静态方法,所以不能重写。和静态变量存在的意义类似。可被任何地方调用。不能重写(类似变量的final)
2. 可以有default方法,且必须实现它。实现类可以重写default方法,但要显示的声明为public方法。

interface Method{
//    int pp();
    static void printM(){
        System.out.println("print");
    }
    
    default void printD(){
        System.out.println("default");
    }
}
class MethidIms implements Method{
    @Override
    public void printD(){
        System.out.println("ims override default");
    }
}

原因
default方法和普通方法类似,它存在的意义是想实现该方法的类有一个默认的方法(类似于默认的功能),当实现类没有重写default方法时,那么调用接口中的default方法。但是当多个接口的default方法同名是,在实现这几个接口的时候,要重写这个default方法,实现类不然不知到要调用哪个接口的default方法。

interface Method{
    static void printM(){
        System.out.println("print");
    }

    default void printD(){
        System.out.println("Method1 default");
    }
}
interface Method2{
    default void printD(){
        System.out.println("Method2 default");
    }
}
class MethodIms implements Method,Method2{
    @Override
    public void printD(){
        System.out.println("ims override default");
    }
}
class MethodIms2 implements Method{
}
public class Main {
    public static void main(String[] args){
        MethodIms ms = new MethodIms();
        ms.printD();
        MethodIms2 ms2 = new MethodIms2();
        ms2.printD();
        Method.printM();
    }
}

//输出
//ims override default
//Method1 default
//print
发布了12 篇原创文章 · 获赞 0 · 访问量 193

猜你喜欢

转载自blog.csdn.net/N_a_n/article/details/105021937