Java基础知识之重写和重载

Java基础知识之重写(Override)和重载(Overload)

一、重写(适用于方法)

两同两小一大原则:

  • 方法名相同,参数类型相同
  • 子类返回类型小于等于父类的返回类型(前提:子父类返回的类型是继承关系),子类抛出的异常要小于等于父类抛出的异常
  • 子类访问权限必须大于等于父类的访问权限

代码 : 父类

public class Animal {

	/**
	 * @Title: getThis 
	 * @Desc: 得到一个未知动物 
	 * @return Animal
	 */
	public Animal getThis() throws IOException {
		return new Animal();
	}
}

子类:

public class Dog extends Animal{

	/**
	 * @Title: getThis
	 * @Desc:  子类方法名和参数与父类方法名和参数已知  jvm就已经认为是覆盖方法
	 * @return 
	 * @see com.swft.c.Animal#getThis()
	 */
	public Animal getThis() throws IOException{
		//返回类型可以是父类返回类型的子类
		return new Dog();	
	}
	
	public static void main(String[] args) throws Exception {
		Animal animal = new Dog();
		System.out.println(animal.getThis().getClass());;
	}
}

输出:class com.swft.c.Dog(Dog类的包路径)

协变返回类型 :
在Java SE5中添加了协变返回类型,它表示在子类中的被覆盖方法可以返回父类方法返回类型的子类。正如上述代码中子类覆盖方法返回Animal类型的导出类 —— Dog类型

二、重载(适用于构造器和方法)

一同一不同原则:

  • 方法名相同
  • 方法参数列表不同(参数类型,参数列表顺序)

1.要是几个方法有相同的名字,Java如何才能知道你指的是哪一个呢?

  • 每个重载的方法都必须拥有一个独一无二的参数列表,甚至参数顺序的不同也能区分两个方法,不过一般不推荐这么做,会导致后期代码难以维护。

2.涉及基本类型的重载

基本类型能从一个“较小”的类型自动提升为一个“较大”的参数类型(对引用类型也适应,但是引用类型是以继承关系为基础判断类型“大小”)

代码:

public class BasicTypeDemo {

	public static void main(String[] args) {
		BasicTypeDemo basicTypeDemo = new BasicTypeDemo();
		basicTypeDemo.say(5);
	}

	public void say(char word) {
		System.out.println("char:"+word);
	}

	public void say(byte word) {
		System.out.println("byte:"+word);
	}

	public void say(short word) {
		System.out.println("short:"+word);
	}

	public void say(int word) {
		System.out.println("int:"+word);
	}
	
	public void say(float word) {
		System.out.println("float:"+word);
	}

	public void say(double word) {
		System.out.println("double:"+word);
	}
}

输出: int:5

我们发现常数值 5 被当作int类型处理,那么我们删除say(int word)这个方法,再看java会调用哪个重载方法?

实验结果输出:float:5.0

我们发现java会优先寻找相同接受类型的重载方法,若没有,则会自动将参数类型提升并寻找对应的方法。char类型略有不同,若找不到相同类型,会直接提升为int类型。

3.能不能以方法返回值来区分重载方法?

public void getInfo() {
	System.out.println(".....");
}

//报错:需要修改方法名
public int getInfo() {
	return 1;
}

很明显这样编译器都报错,原因在于,当 int x = getInfo() 这样调用,那么的确可以一次区分它们,但是有时候调用者并不关心调用方法的返回值,在 getInfo() 这样调用,此时java该如何判断调用哪个方法呢?所以以返回值区分重载方法是行不通的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十万芙特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值