java中重载和重写的区别

我已经遇到这两个东西很多遍了,每次遇到都是一知半解,说不出个所以然。这次又遇到了,就想把自己关于这两个东西的理解给梳理一下。也可以对以后的我有帮助(主要是怕自己又忘了(#.#))

那么开始吧。。(这两个东西都是对方法起作用的)
其实,关于两个东西的区别,有一个决定性的判断,重载必须发生在一个类中,而重写是发生在父类子类中(也就是有继承关系的类中)
这个是决定性的。
其次,重载的方法名必须相同,参数列表不同(也可以说就是依据参数列表进行重载的)。
参数列表的不同包括:参数的个数不同、参数的类型不同、参数的顺序不同

public class OverLoad {
	
//	数据类型不同的重载
	public void test(int a) {}
	public void test(String a) {}

	
//	参数个数不同的重载
	public void t2(int a,int b) {}
	public void t2(int a) {}
	
//	参数顺序不同的重载
	public void t3(int a ,String b) {}
	public void t3(String b,int a) {}
	
//	注意参数顺序不同的重载不能写成同类型的
	public void t4(int a,int b) {}  //像这个两个参数都是int类型,交换参数没有意义,也就不是重载了。
}

还要注意一些重载的特殊情况

//猜一下这个代码输出的是哪个语句?
public class OverLoad2 {

	public void test(int a) {
		System.out.println("我是int里面的");
	}
	
	public void test(short a) {
		System.out.println("我是short里面的");
	}
	
	public static void main(String[] args) {
		OverLoad2 o = new OverLoad2();
		o.test(10);
		
	}
}

没错,下面这个就是输出结果在这里插入图片描述
原因:
java中也是遵守就近原则的,离哪个类型近一点就执行哪一个,传入的是10,默认是int类型,所以说,执行的是这个。

当然,有一个参数的特殊情况就会有两个参数的特殊情况

//猜一下这个的执行结果~~
public class OverLoad2 {

	public void test(int a,long b) {}
	public void test(long a,int b) {}
	
	public static void main(String[] args) {
		OverLoad2 o = new OverLoad2();
		o.test(10, 10);
		
	}
}

答案是会报错,,,因为这个就是像有选择困难症的人一样,jvm看到第一个参数是10,int找到了第一个方法,第二个也是10,就找到了第二个方法,最后就不知道执行哪个方法了。
这个的修改可以把o.test(10L,10)改为这样,当然也可以把参数列表给修改一下比如把第一个方法改为test(int a,int b),第二个也是同理。

接下来是重写的方法名和参数列表
(在发生在父类和子类的前提下)重写的方法名和参数列表必须是相同的,就像我们经常重写Object类里面的toString()方法。

class Person{
	public void test() {
		System.out.println("我是父类里面的测试方法");
	}
}

class Student extends Person{
	
	public void test() {
		System.out.println("我是子类中的测试方法");
	}
}

public class Override {
	public static void main(String[] args) {
		Student s = new Student();
		s.test();
		
	}
}

像这个Student和Person就是用的方法的重写,重写也就是在子类中重新书写该方法。也就是父类的代码不能满足当前子类的需求时使用。

重载的修饰符、返回类型和抛出异常等
重载对这些东西没有特别的要求,也就是说这些东西可以相同,也可以不相同,但是,它们大多数情况下都是相同的。

重写的修饰符、返回类型和抛出异常
重写的修饰符可以将子类的修饰符不变或者扩大但是不能缩小

class Person{
	protected void test() {
		System.out.println("我是父类里面的测试方法");
	}
}

class Student extends Person{
	
	public void test() {
		System.out.println("我是子类中的测试方法");
	}
}

public class Override {
	public static void main(String[] args) {
		Student s = new Student();
		s.test();
		
	}
}

比如这个父类方法修饰符为protected,那子类就能和他相同或者扩大,但权限不能比父类的小,
修饰符的种类(修饰权限从高到低)
public -----protected-----default-----private
重写的返回类型和抛出异常都不能比父类的大(可以是相等也可以是子类型)

重写返回类型,子类可以返回的类型和父类的相同,也可以是子类型,也就是说,子类的返回类型可以是父类的子类型。
但是,也要注意一些特殊情况

//这个代码会执行报错的,因为short并不是int的子类型。
class Animal{
	public int test() {
		return 0;
	}
}

class Dog extends Animal{
	public short test() {
		return 0;
	}
}
public class Override3 {
	public static void main(String[] args) {
		Animal a = new Dog();
		a.test();
	}
	
}

重写的抛出异常也是同理,子类抛出的异常不能比父类抛出的异常大。也就是说,不能扩大异常的作用范围。

以上就是java中重载和重写的区别啦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值