notys's blog
大道至简
OOP-Overload与Override.md

重载

package xyz.zzjava.www.exer;
/*
 * 方法的重载(overload)
 * 1,定义:在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可.
 * 
 *  "两同一不同":同一个类,相同方法名.	即:参数个数不同,参数类型不同
 *  
 * 2,举例:
 * 		Arrays类中重载sort()/binarySearch()
 * 3,判断是否是重载:
 * 				与方法的权限修饰符,返回值类型,形参变量名,方法体都没有关系
 * 4,在通过对象调用方法时,如何确定某一个指定的方法:	方法名---->参数列表
 */
public class OverLoadTest {
	public static void main(String[] args) {
		
		OverLoadTest test = new OverLoadTest();
		test.getSum(1,2);
		
	}
	
	//如下的4个方法构成了重载
	public void getSum(int i,int j){
		System.out.println("1");
	}
	
	public void getSum(double d1,double d2){
		System.out.println("2");
	}
	
	public void getSum(String s ,int i){
		System.out.println("3");
	}
	
	public void getSum(int i,String s){
		System.out.println("4");
	}
	
	//如下的3个方法不能与上述4个方法构成重载
//	public int getSum(int i,int j){
//		return 0;
//	}
	
//	public void getSum(int m,int n){
//		
//	}
	
//	private void getSum(int i,int j){
//		
//	}

重写

① 父类

package xyz.zzjava.www.exer;

public class Person {
	
	String name;
	int age;
	
	public Person(){
		
	}
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	 void eat(){
		System.out.println("吃饭");
	}
	public void walk(int distance){
		System.out.println("走路,走的距离是:" + distance + "公里");
		show();
		eat();
	}
	
	private void show(){
		System.out.println("我是一个人");
	}
	
	public Object info(){
		return null;
	}
	
	public double info1(){
		return 1.0;
	}

}

② 子类

package xyz.zzjava.www.exer;

public class Student extends Person{

	String major;
	
	public Student(){
		
	}
	public Student(String major){
		this.major = major;
	}
	
	public void study(){
		System.out.println("学习。专业是:" + major);
	}
	
	//对父类中的eat()进行了重写
	public void eat(){
		System.out.println("学生应该多吃有营养的食物");
	}
	
	public void show(){
		System.out.println("我是一个学生");
	}
	
	public String info(){
		return null;
	}
	
//	public int info1(){
//		return 1;
//	}
	
//	public void walk(int distance){
//		System.out.println("重写的方法");
//	}

	public void walk(int distance) {
		System.out.println("重写的方法");
	}
}

③ 测试类

package xyz.zzjava.www.exer;
/*
 * 方法的重写(override / overwrite)
 * 
 * 1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作
 * 
 * 2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
 * 
 * 3. 重写的规定:
 * 			方法的声明: 权限修饰符  返回值类型  方法名(形参列表) throws 异常的类型{
 * 						//方法体
 * 					}
 * 			约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
 * 		① 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
 *      ② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
 *      	>特殊情况:子类不能重写父类中声明为private权限的方法
 *      ③ 返回值类型:
 *      	>父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
 *      	>父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
 *      	>父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)
 *		④ 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(具体放到异常处理时候讲)
 *	**********************************************************************
 *		子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。	
 *
 * 面试题:区分方法的重载与重写
 */
public class PersonTest {
	
	public static void main(String[] args) {
		
		Student s = new Student("计算机科学与技术");
		s.eat();
		s.walk(10);
		
		System.out.println("**************");
		
		s.study();
		
		Person p1 = new Person();
		p1.eat();
	}
}