Java学习之方法重载和方法重写(覆盖)比较

方法重载和方法覆盖

请带着下面两点来看文章:

  1. 覆盖即重写,覆盖不等于重载,即重写不等于重载。
  2. 覆盖(重写)蕴含继承性,而重载只能在本类中使用,不含继承。

方法名和参数列表的比较

方法覆盖中的方法名和参数

首先创建基类Shape:


public class Shape {

 

    public void draw() {

        System.out.println("Shape.draw()");

    }

}   

子类Circle:


public class Circle extends Shape {

 

   public void draw() {

        System.out.println("Circle.draw()");

    }

}   

>注意:子类没有在方法上添加`@Override`注解

此时修改父类Shape的draw方法名为draw1:


    /*public void draw() {

        System.out.println("Shape.draw()");

    }*/

    

    public void draw1() {

        System.out.println("Shape.draw()");

    }

编译器不会报错,因为子类的`draw()`并没有覆盖(重写)父类的`draw()`,现在在子类Circle的draw方法上添加注解`@Override`,此时子类Circle如下,下划线表示该方法报错(下面不再说明)


    /*public void draw() {

        System.out.println("Circle.draw()");

    }*/

    

    @Override

    public void draw() {

        System.out.println("Circle.draw()");

    }

此时,编译器报错,提示:子类Cricle的draw方法必须重写或实现父类的draw1方法。

结论:重写父类方法时必须加`@Override`注解,且方法名要相同。

再修改父类的方法如下:


    /*public void draw() {

		System.out.println("Shape.draw()");

	}*/

	

	

	/*public void draw1() {

		System.out.println("Shape.draw()");

	}*/

	

	public void draw(int i) {

		

	}

子类如下:


    ...

    /*@Override

	public void draw() {

		System.out.println("Circle.draw()");

	}*/

	

	@Override

	public void draw(float i) {

		System.out.println("Circle.draw()");

	}

子类的覆盖方法报错,提示:必须实现父类的相关方法或移除`@Override`注解。

在修改子类draw方法如下:


    @Override

	public void draw(int i, int j) {

		super.draw(i);

	}

子类的覆盖方法也报如上错误。

结论:重写或覆盖父类方法时,参数类型和参数列表个数必须相同。

方法重载中的方法名和参数

在Cricle类中添加以下方法:


...	

public void erase() {

	System.out.println("Circle.erase()");

}

}

编译器报错,提示重复的erase()方法。

修改后如下:


	public void erase() {

		System.out.println("Circle.erase()");

	}

	

	public void erase(int i) {

		System.out.println("Circle.erase()");

	}

编译通过。

伪论(下面给出证明):重载的方法名相同,但参数个数必须不同。

在修改Cricle类如下:


...

    public void erase(int i, int j) {

		System.out.println("Circle.erase()");

	}

	

	public void erase(int i, String s) {

		System.out.println("Circle.erase()");

	}

编译通过。

结论:重载的方法名必须相同,参数个数可以不同,但参数类型必须不同。一句话就是,重载的方法名必须相同且参数列表必须不同。

返回值类型的比较

方法覆盖中的返回值类型

父类Shape:


    ... 

    public String draw() {

		return "Shape.draw()";

	}

子类Circle:


   ...

    @Override

	public int draw() {		

		return super.draw();

	}

编译器不同通过。提示和父类的draw方法的返回值类型不兼容。

结论:方法覆盖的返回值类型必须和父类相兼容。

方法重载中的返回值类型

Cricle类:


    private int erase(int i, int j) {

		return 0;

	}

	

	private void erase(int i, int j) {

		System.out.println("Circle.erase()");

	}

编译不通过,提示重复的erase(int, int)方法。

修改后:


    private int erase(int i, int j) {

		return 0;

	}

	

	private void erase(int i, String j) {

		System.out.println("Circle.erase()");

	}

编译通过。

结论:方法重载的返回值类型可以不同,但前提是参数列表不同。

访问权限的比较

方法覆盖中的访问权限

还原父类Shape:


public class Shape {

 

    public void draw() {

        System.out.println("Shape.draw()");

    }

}

此时在子类Cricle中修改draw方法的访问权限:


    @Override

    private void draw() {

        System.out.println("Circle.draw()");

    }  

编译器报错,提示:不能降低从父类Shape继承来的方法的可见性

此时无论修改子类Cricle中的draw方法的访问权限为protected、private还是默认级别都提示不能降低从父类继承来的方法的可见性。

只能将子类的draw方法的访问权限设置为public才可以编译通过

此时修改父类draw方法的访问权限为private:


private void draw() {

    System.out.println("Shape.draw()");

}

子类:


@Override

public void draw() {

    System.out.println("Circle.draw()");

}

编译器报错,提示:必须实现父类的draw方法。

此时修改父类draw方法的访问权限为protected 或默认级别,编译器就不报错了。

结论:父类中被private修饰的方法无法被子类覆盖,即无法被子类继承。

方法重载中的访问权限

Circle类代码:


    public void erase() {

		System.out.println("Circle.erase()");

	}

	

	protected void erase(int i) {

		System.out.println("Circle.erase()");

	}

	

	private void erase(int i, int j) {

		System.out.println("Circle.erase()");

	}

	

	void erase(int i, String s) {

		System.out.println("Circle.erase()");

	}

编译通过。

结论:重载方法对访问权限不敏感。

OK, 如果有错误或遗漏的地方请评论指出,互相交流,共同进步。谢谢!

版权声明:欢迎转载!请注明出处:http://blog.csdn.net/u011726984

时间: 2024-10-27 02:12:12

Java学习之方法重载和方法重写(覆盖)比较的相关文章

JAVA学习(七):方法重载与方法重写、thiskeyword和superkeyword

方法重载与方法重写.thiskeyword和superkeyword 1.方法重载 重载可以使具有同样名称但不同数目和类型參数的类传递给方法. 注: 一是重载方法的參数列表必须与被重载的方法不同,而且这样的不同必须足以清楚地确定要调用哪一个方法: 二是重载方法的返回值类型能够与被重载的方法同样,也能够不同,可是仅仅有返回值类型不同不能表示为重载. 比如,最经常使用的println()方法在JDK的java.io.PrintStream中定义了十几种形式的重载,经常使用格式例如以下: public

JAVA学习(七):方法重载与方法重写、this关键字和super关键字

方法重载与方法重写.this关键字和super关键字 1.方法重载 重载能够使具有相同名称但不同数目和类型参数的类传递给方法. 注: 一是重载方法的参数列表必须与被重载的方法不同,并且这种不同必须足以清楚地确定要调用哪一个方法: 二是重载方法的返回值类型可以与被重载的方法相同,也可以不同,但是只有返回值类型不同不能表示为重载. 例如,最常用的println()方法在JDK的java.io.PrintStream中定义了十几种形式的重载,常用格式如下: public void println(in

Java笔记 —— 方法重载和方法重写

h2 { color: #4ABCDE } a { text-decoration: none !important } a:hover { color: red !important; text-decoration: underline !important } pre { border: solid 1px #CCCCCC; background-color: #F8F8F8; margin: 15px; overflow: auto; white-space: pre; font-siz

面向过程和面向对象的区别,方法重载和方法重写的区别

先有面向过程,而后退出面向对象 面向过程和面向对象两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想. 打个比方 蒋介石和毛主席分别是面向过程和面向对象的杰出代表,这样充分说明,在解决复制问题时,面向对象有更大的优越性. 面向过程是蛋炒饭,面向对象是盖浇饭.盖浇饭的好处就是"菜""饭"分离,从而提高了制作盖浇饭的灵活性.饭不满意就换饭,菜不满意换菜.用软件工程的专业术语就是"可维护性"比较好,

AJPFX总结方法重载与方法重写的区别

方法重载在同一个类中,可以出现同名方法,但是这些同名方法的参数列表必须不同,这样定义方法叫做方法重载.方法重载的特点重载的注意事项重载与返回值无关重载与具体的变量标识符无关重载只与方法名与参数相关重载方法方法名必须相同重载方法参数必须不同:参数个数不同参数类型不同参数顺序不同 方法重写(方法重载是在一个类里) 严格检查方法的格式 @Override 方法重写 @Overload方法重载   在方法前添加概念当子类继承父类后,拥有了父类非私有的方法并可以直接调用.但是子类可以按照子类自身的逻辑重新

java面向对象编程(六)--四大特征之继承、方法重载和方法覆盖

一.继承 1.继承的概念 继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends语句来声明继承父类.语法如下: class 子类 extends 父类 这样,子类就会自动拥有父类定义的某些属性和方法.另外,并不是父类的所有属性.方法都可以被子类继承.父类的public修饰符的属性和方法,protected修饰符的属性和方法,默认修饰符属

Java方法继承、方法重载、方法覆盖小总结

转自:http://blog.csdn.net/cdsnmdl/article/details/3968688 ———————————————————————————————————— 1.方法继承:利用extends关键字一个方法继承另一个方法,而且只能直接继承一个类. 当Sub类和Base类在同一个包时Sub类继承Base类中的public/protected/默认级别的变量个方法 在不同包时继承public/protected级别的变量和方法. 2.方法重载:如果有两个方法的方法名相同,但

疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同时这这里我们需要注意以下两点:  A.方法重载与返回值类型没有任何关系;  B.方法重载与是否有static修饰没有任何关系. 那我们如何才能确定到底调用的哪个方法呢?  A.主调者:明确是谁在调用这个方法,是类还是对象  B.方法名和形参:确定调用哪个方法(由方法名和形参共同决定) 例1: 1 p

JAVA SE中方法重载和方法重写及数据库中子程序的重载

首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私有的特性,同时子类还可以扩展自己的特性,这样就引出了方法重写和方法重载! 一.方法重写(Override)         在Java中如何来定义重写:Java程序中类的继承特性可以产生一个子类,子类继承父类就拥有了父类的非私有的属性(方法和变量),在子类中可以增加自己的属性(方法和变量),同时也可以