Java 重写(Override)与重载(Overload)
重写
是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,属于编译时多态。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。在面向对象原则里,重写意味着可以重写任何现有方法。
方法重写的规则
- 参数列表必须完全与被重写方法的相同;
- 返回类型必须完全与被重写方法的返回类型相同;
- 访问权限不能比父类中被重写的方法的访问权限更高。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
- 父类的成员方法只能被它的子类重写。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重写,但是能够被再次声明,子类中的static方法会被隐藏。
- 如果一个方法不能被继承,那么该方法不能被重写。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。
重载
是在一个类里面,方法名字相同,而参数不同,属于运行时多态。返回类型呢?可以相同也可以不同。JAVA的方法签名就是方法名+参数列表(方法的参数的顺序,类型和个数),不包括返回值和访问修饰符。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。方法重载是Java 实现多态性的一种方式。
重载规则:
- 被重载的方法必须改变参数列表;
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
重写与重载之间的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
最佳实践
1、虽然参数的顺序不同也能够区分重载方法,但最好别这样做,因为会造成代码难以维护;
2、对于父类的private方法,子类中最好不要声明同名的方法,因为会让人误解private方法可以被重写。
值传递和引用传递
值传递
方法调用时,实际参数把它的值传递给对应的形式参数,方法中执行形式参数值的改变不影响实际参数的值。基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。String对象和基本类型一样,一般情况下作为参数传递,在方法内改变了值,而原对象是不会被改变的。
引用传递
也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法中执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。在Java中对象或数组作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
java初始化顺序
- (静态变量、静态初始化块)>(变量、初始化块)> 构造器。
- 继承情况下,父类–静态变量、静态初始化块 > 子类–静态变量、静态初始化块 > 父类–变量、初始化块 > 父类–构造器 > 子类–变量、初始化块 >子类–构造器
- 静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。
- 静态代码块是在类加载时自动执行的,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。
Spring的依赖注入
通过使用依赖注入,Java EE应用中的各种组件不需要以硬编码方式耦合在一起,甚至无需使用工厂模式。当某个Java 实例需要其他Java 实例时,系统自动提供所需要的实例,无需程序显示获取,这种自动提供java实例我们谓之为依赖注入,也可以称之为控制反转(Inversion of Control IoC)。
其实不管是控制反转还是依赖注入,他们都可以这样理解:当某个Java实例(调用者)需要另一个Java实例(被调用者)时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例。但是在依赖注入/控制反转模式下,创建被调用者的工作不再是有调用者来完成,而是由Spring容器来完成,然后注入调用者。
依赖注入通常有如下两种:
用XML文件的形式取代了对象实例间的显示调用。
1、设置注入:IoC容器使用属性的setter方法来注入被依赖的实例。
2、构造注入:IoC容器使用构造器来注入被依赖的实例。
引用:
http://my.oschina.net/jackieyeah/blog/368335
http://www.w3cschool.cc/java/java-override-overload.html
Java值传递与引用传递
java参数传递(值传递还是引用传递)
Spring读书笔记—–Spring核心机制:依赖注入