上篇博客中讲到了Java中的继承,那么我们知道子类虽然能继承父类中的一部分方法,但但有时候,当父类方法已经不能满足子类对象的的特征是,父类方法就不再适用,这时就需要用到Java中的重写。

一、重写是什么?

子类可以继承父类方法,但有时从父类继承的方法在子类中必须进行修改以适应新类的需要,这种对父类方法进行改写或改造的现象称为方法重写或方法覆盖。父类方法在子类中重写使继承更加灵活。

二、如何重写?

举下面两段代码:

父类:

public class Father {
	
	public Object eat(String a) {
		System.out.println("用筷子吃饭");
		return "meat";
	}
}

未重写的子类代码:

public class Son extends Father{
	
	
	
	public static void main(String[] args) {
		Son son = new Son ();
		son.eat("3");
		
	}
}

子类运行结果:

Java重写人的类 java如何重写_Java重写人的类

子类程序照常运行了父类方法。

将子类方法重写:

public class Son extends Father{
	
	@Override
	public Object eat(String str) {
		System.out.println("用刀叉吃饭");
		return "rice";
	}
	
	public static void main(String[] args) {
		Son son = new Son ();
		son.eat("3");
		
	}
}

提取出这一段代码:

@Override
              public Object eat(String str) {
                       System.out.println("用刀叉吃饭");
                       return "rice";
               }

这里首先反映出了Java中重写方法的一部分规则:

1.方法名相同,参数列表相同(个数和数据类型相同)

2.Java中用@Override标注重写后的方法,如果重写不成功,标注会报错。

3.public protected friendly private ,重写后的方法的访问权限只能和父类的相同或比父类的大。

错误示范:

Java重写人的类 java如何重写_Java_02

Java重写人的类 java如何重写_Java_03

当然,重写远远不止这么简单。重写还有如下规则,一一验证:

4.如果父类中方法用final修饰,则该方法无法被重写。

试错:

Java重写人的类 java如何重写_Java_04

 

Java重写人的类 java如何重写_父类_05

 5.返回值,如果父类返回值为void类型或基本数据类型(byte short int long float double char boolean),则子类重写后方法的返回值必须与父类相同。如果父类返回值为引用类型,则子类返回值要么与父类相同,要么是父类返回值的类型的子类。

 父类:

Java重写人的类 java如何重写_父类_06

 子类:

Java重写人的类 java如何重写_父类_07

返回值为引用型时:

父类:

Java重写人的类 java如何重写_Java_08

子类:

Java重写人的类 java如何重写_Java重写人的类_09

6.静态方法不能用来重写父类方法,也不能被作为父类方法重写。

报错:

父类为静态方法:

Java重写人的类 java如何重写_子类_10

Java重写人的类 java如何重写_Java_11

 

子类为静态方法:

Java重写人的类 java如何重写_Java重写人的类_12

Java重写人的类 java如何重写_Java_13

 

综上,就是对Java继承中重写的详述。