# 方法

按照方法的返回值和参数类型可以分为:

  • 有参数有返回值;
  • 无参数无返回值;
  • 有参数无返回值;
  • 无参数有返回值;

    | 静态方法

    在 Java 中,使用 static 修饰的方法称为静态方法。

    1. public static void staticfunc() {}

    * 静态方法不能调用非静态成员的原因

  • 静态方法是属于类的,在类加载的时候会分配内存,可以通过类名直接访问。但是非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。

  • 在类的非静态成员不存在的时候静态成员就已经存在,此时调用在内存中还不存在的非静态成员属于非法操作。

    * 静态方法和实例方法的区别

  • 调用实例方法需要创建实例对象,调用静态方法无需创建实例对象,可以通过类名直接调用。

  • 访问本类成员时,静态方法只允许访问静态成员,实例方法可以访问静态成员和实例成员。

    1. public class example {
    2. public static int i = 1;
    3. public int j;
    4. // 实例方法可以访问静态成员和实例成员
    5. public void func() {
    6. System.out.println(i);
    7. System.out.println(j);
    8. }
    9. // 静态方法只能访问静态成员
    10. public static void staticfunc() {
    11. System.out.println(i);
    12. }
    13. }

    | 重写和重载

    * 重载

    重载:同一个类中的多个同名方法根据不同的传参来执行不同的逻辑处理。

    1. StringBuilder sb = new StringBuilder();
    2. StringBuilder sb2 = new StringBuilder("HelloWorld");

    重载解析(overloading resolution):编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。 如果编译器找不到匹配的参数, 就会产生编译时错误, 因为根本不存在匹配, 或者没有一个比其他的更好。

* 重写

重写发生在运行期,是子类对父类的允许访问方法的实现过程的重新编写。
重写遵循“两同两小一大的”原则:

  • 两同:方法名相同、形参列表相同。
  • 两小:

    • 子类方法的返回值类型比父类返回值类型更小或相等。
    • 子类方法抛出的异常类比父类抛出的异常类更小或者相等。

      如果方法的返回值类型是 void 或基本数据类型,则返回值重写时不可修改。如果方法的返回值是引用类型,则可以返回该引用类型的子类。

  • 一大:子类方法的访问权限比父类方法的访问权限更大或者相等。

    如果父类的访问修饰符为 private/static/final 则子类就不能重写该方法,但是 static 修饰的方法可以再次声明。

* 区别

区别点 重载 重写
发生范围 相同类 子类
参数列表 必须修改 不可修改
返回类型 可修改 必须比父类的返回值类型更小或相等
异常 可修改 必须比父类的异常类型更小或相等
访问修饰符 可修改 要比父类方法的访问权限更大或者相等
发生阶段 编译期 运行期

| 可变长参数

从 Java5 开始支持可变长参数,允许在调用方法的时候传入不定长度的参数,但是可变长参数只能作为函数的最后一个参数。重载会优先匹配固定参数的方法。可变长参数编译后会被转换为一个数组。