java — 重载和覆盖

重载(overload):对于类的方法,方法名相同,参数列表不同的方法之间构成了重载关系。 

参数列表:参数的类型、参数的个数、参数的顺序。

  子类从父类继承来的方法也可以发生重载。

  如果多个方法有相同的名字、不同的参数,便产生了重载。编译器必须挑选出具体执行哪个方法,通过各个方法给出的参数类型与特定的方法调用所使用的值类型进行匹配来挑选出相应的方法。

  如果找不到匹配的参数,或者有多个可能的匹配,就会产生编译时错误。

重载关系只能发生在同一个类中吗?不是的。

  这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自己显式写出来的以外,还有父类遗传下来的。所以子类中的某个方法和父类中继承下来的方法也可以发生重载的关系。

  看方法之间是否是重载关系,不用管方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。

package OverloadAndOverride;

public class Dog 
{
	Dog()
	{
		
	}
	
	void bark()
	{
		System.out.println("no barking!");
		this.bark("123", 123.2 );
	}
	
	void bark(String m, double l)
	{
		System.out.println("a barking dog.");
		this.bark(5, "china");
	}
	
	void bark(int a, String n)
	{
		System.out.println("a cute cat.");
	}
	
	public static void main(String[] args)
	{
		Dog dog = new Dog();
		dog.bark();
		dog.bark(5, "123");
		dog.bark("123", 1);
	}

}

输出结果:

no barking!
a barking dog.
a cute cat.
a cute cat.
a barking dog.
a cute cat.

再看一个重载的例子

package OverloadAndOverride;

public class OverrideTest 
{
	void max(int a, int b)
	{
		System.out.println(a > b ? a:b);
	}
	
	void max(short a, short b)
	{
		System.out.println(a > b ? a:b);
	}

	void max(float a, float b)
	{
		System.out.println(a > b ? a:b);
	}
	
	public static void main(String[] args)
	{
		OverrideTest test = new OverrideTest();
		//调用int的
		int a1 = 1;
		int a2 = 2;
		test.max(a1, a2);
		
		//调用double的
		float a3 = 1;
		float a4 = 2;
		test.max(a3, a4);
		
		//调用short的
		short a5 = 1;
		short a6 = 2;
		test.max(a5, a6);
		
	}
	
	
	
}

输出结果:

2
2.0
2

覆盖(override):当父类中的某些方法不能满足需要的时候,子类改写父类的方法,当父类中的方法被覆盖之后,除非使用super关键字,否则无法再调用父类的方法。

覆盖的条件:

  1、“三同一不低”:方法名称、参数列表、返回类型相同,子类的访问修饰符的权限不能比父类低;

  2、子类方法不能比父类抛出更多的异常。即子类所抛出的异常必须和父类方法所抛出的异常一致,或子类中不抛出异常;

  3、被覆盖的方法不能是final类型的,因为final类型的方法无法被子类覆盖;

  4、被覆盖的方法不能是private类型的,否则在子类中只是定义类一个新的方法,并没有对其进行覆盖;

5、被覆盖的方法不能是static类型的,如果父类的方法为static类型的,而子类的方法不是static类型的,那么两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然,即使父类和子类中的方法都是static类型的,并且满足覆盖条件,但是仍然不会发生覆盖,因为static是在编译的时候将静态方法和类的引用类型进行匹配。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

理解java Class类

http://blog.csdn.net/bingduanlbd/article/details/8424243/

13610
来自专栏开发与安全

Java与C/C++不同的一些基础知识点

0. 类与文件 一个 java 文件可以写多个类,每个类里面可以有main函数,一个java文件里面只能有一个 public 类,此时 java 文件的命名只...

20300
来自专栏小鹏的专栏

用一个脚本学习 python

# -*- coding: utf-8 -*- # Python 2.7 学习参考脚本 # print 打印函数 print "Hello Worl...

31070
来自专栏Python小屋

Python中修饰器的定义与使用

修饰器(decorator)是函数嵌套定义的另一个重要应用。修饰器本质上也是一个函数,只不过这个函数接收其他函数作为参数并对其进行一定的改造之后使用新函数替换原...

38550
来自专栏C#

解析C#类中的构造函数

《解析C#类中的构造函数》 一.  C#中的构造函数概述: C#中类包含数据成员和函数成员。函数成员提供了操作类中数据的某些功能,包括方法、属性、构造器和终结器...

23050
来自专栏浪淘沙

实训day05--静态,继承

2018.06.08 1.private关键字 权限修饰符 修饰类,方法,属性,构造函数 最常用的形式: 把成员变量用pri...

12550
来自专栏别先生

java中集合类中Collection接口中的Map接口的常用方法熟悉

1:Map接口提供了将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map接口中同样提供了集合的常用方法。 2:由于Map集合中的元素...

232100
来自专栏从流域到海域

Python list(列表)

Python一共有6种序列的内置类型,list和tuple是其中最常见的。6种序列的都可以进行的操作包括索引、切片,加(实际上是连接),乘(实际上是复制)...

30760
来自专栏java一日一条

常见Java面试题 – 第五部分:equals与==

因此,上面的问题考察了面试者对”==” 和 “equals( )”在Java对象上如何应用的理解是否正确。前者比较引用,后者则比较对象中真正的值。

10310
来自专栏软件开发 -- 分享 互助 成长

C++静态成员变量和静态成员函数小结

静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成...

21350

扫码关注云+社区

领取腾讯云代金券