方法、方法的重载(Overload)与重写(Override)

我们为什么需要方法、重载与重写?

  有一些功能,有着固定的步骤与格式,而且需要多次使用到。如果每使用一次我们就完整的写一次代码,不仅自己写代码写的累,而且代码冗余不好看。这时候,我们就需要方法,将这些相同类似的代码封装成一个功能,然后需要使用时直接进行简单的调用即可。

  在同一个类中,同一个方法名有着不同的参数的时候,要怎么解决呢?这时候就需要Java给我们提供的方法的重载。

  在继承关系中,子孙类对父类的方法不满意,想继续使用父类的方法名但方法内容自己重写写,这时候方法的重写就派上了用场。

方法

  Java方法是语句的集合,它们在一起执行一个功能:

  • 方法是解决一类问题的步骤的有序组合
  • 方法包含于类或对象中
  • 方法在程序中被创建,在其他地方被引用

  方法的优点:

  1. 使程序变得更简短而清晰。
  2. 有利于程序维护。
  3. 可以提高程序开发的效率。
  4. 提高了代码的重用性。

方法的命名规则

  1.方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:eatFood。
  2.下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。例如 testPop_emptyStack。

方法的定义

方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

  • 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
    返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
  • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
  • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
  • 方法体:方法体包含具体的语句,定义该方法的功能。
修饰符 返回值类型 方法名(参数类型 参数名){
    ...
    方法体
    ...
    return 返回值;
}

void关键字

  上面已经说到了,当没有返回值的时候,返回值类型应该填写关键字void。所以在填数据类型的地方,也可以填void关键字,我们是不是可以理解void也是一种特殊的数据类型呢?

  我自己就是这样理解的,我认为void就是一种特殊的数据类型,而且还是特殊的基本数据类型,因为引用数据类型,是可以new出来的,而且void不能在堆里面分配空间存对应的值。虽然void也不能像基本数据类型一样定义变量,但我觉得它还是更像基本数据类型一些。

  以上理解均是我个人的看法,如果有错误欢迎指正。

可变参数

  从Java 5 以后,支持了可变参数,就是在方法声明中,在指定参数类型后加一个省略号(…) ,再跟上参数名。

  一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

  用上可变参数后,方法的参数个数就可以不再固定了。实例:

public class Test {

	public static void main(String[] args) {

		System.out.println(add(1));        // 也可以,不为可变参数传值
		System.out.println(add(1, 2));
		System.out.println(add(1, 2, 3));
		System.out.println(add(1, 2, 3, 4));  // 1匹配了参数a,1后面的都传入了可变参数中

	}

	static int add(int a, int... numbers) {

		int sum = 0;

		if (numbers.length <= 0) {
			sum = a;
		} else {

			for (int i : numbers) {    // 可变参数会以数组形式存起来,所以用foreach遍历
				sum = sum + i;
			}
			sum = sum + a;
		}
		return sum;
	}
}
-----------------------------------------------------------
输出结果:
1
3
6
10

方法与函数

  我在大学学的第一门语言是C语言,在C语言里,将这种可以重复调用的功能代码块称为函数。那方法与函数的区别是什么呢?我自己思考了一番,也查询了一些资料,我觉得:方法和函数就是一个东西的不同叫法而已(来了,我又想吐槽,IT业内对同一个东西总有多种叫法)。在Java中,我们都习惯叫为方法,而在讨论C语言里习惯叫为函数。当然同一种东西,在不同的语言里有着不同的作用与用法,这是语言的特性决定的,中心思想还是一样的,我并不觉得因此就是两种不同的东西了。

方法的重载(Overload)

  当我们希望相同的方法名,但不同的参数个数、参数类型时,就可以用上方法的重载,最常用的就是构造器里的重载了(《构造器》)。实例:

public class Test {

	public static void main(String[] args) {

		System.out.println(add(5, 3));
		System.out.println(add(10, 8, 7));    // 会根据参数个数、类型,自动匹配合适的方法
		System.out.println(add(5.18 , 3.07));

	}

	static int add(int a, int b) {
		return a + b;
	}
	
	static int add(int a, int b,int c) {     // 参数个数不同
		return a + b + c;
	}
	
	static double add(double a, double b) {   // 参数类型、返回值类型,不同
		return a + b;
	}
}
---------------------------------------
输出结果:
8
25
8.25

  重载规则:

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

方法的重写(Override)

  重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

  需要注意重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

  来个实例:

class Animal{
	void eatFood() {
		System.out.println("吃吃吃");
	}
}

class Cat extends Animal{
	
	@Override
	void eatFood() {
		System.out.println("吃小鱼干");
	}
	
}

public class Test {

	public static void main(String[] args) {
		
		Animal animal1 = new Animal();
		Cat cat1 = new Cat();
		animal1.eatFood();
		cat1.eatFood();

	}

}
--------------------------------
输出结果:
吃吃吃
吃小鱼干

方法的重写规则:

  • 参数列表必须完全与被重写方法的相同。

  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。

  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

  • 父类的成员方法只能被它的子类重写。

  • 声明为 final 的方法不能被重写。

  • 声明为 static 的方法不能被重写,但是能够被再次声明。

  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。

  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。

  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

  • 构造方法不能被重写。

  • 如果不能继承一个方法,则不能重写这个方法。

发布了18 篇原创文章 · 获赞 0 · 访问量 412

猜你喜欢

转载自blog.csdn.net/HhmFighting/article/details/104885734
今日推荐