重载
重载对于面向对象编程来说是一个难点,相对C++来说,Java这个方面较为简单。这里我们主要讨论方法的两种形式的重载和构造函数的重载。通过本次学习,大家会对Java面向对象编程的思想有更一步的理解。
7.1 方法的重载
通过方法重载可以实现多态,多态性是面向对象编程的一个重要的特点。Java语言中对方法的重载分为两类,我们在下面依次具体介绍。
7.1.1 Overload名称重载
指同一个类中的多个方法可以享用相同的名字,只要它们声明的参数不同。这种不同体现在或者参数的个数不同,或者其参数类型不同。编译器根据参数的个数和类型来决定当前所使用的方法。需要注意的是多个方法必须返回相同的数据类型,它们的不同只在于参数。
我们可以通过如下的例子来了解名称重载。
public class Mytest {
public void printNumbers ( int a, int b ) {
System.out.println(a);
System.out.println(b);
}
public void printNumbers ( int a, int b, int c ) {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
7.1.2 Override覆盖重载 在类层次结构中,如果子类中的一个方法与它超类中的方法用相同的方法名、返回类型和参数表,就称子类中的方法覆盖重载超类中的方法。从子类中调用重载方法时,它总是引用子类定义的方法,而超类中定义的方法将被隐藏。也就是说,通过覆盖重载,子类修改了从超类继承下来的行为。
需要注意的是方法覆盖仅载两个方法的名称和类型都相同时才发生。如果仅有名称相同,那两个方法只是覆盖。
另外使用方法覆盖还需要注意要保证以下几点:
☆ 覆盖方法的返回类型必须与它所覆盖的方法相同。
☆ 覆盖方法不能比它所覆盖的方法访问控制范围差。
☆ 覆盖方法不能比它所覆盖的方法抛出更多的异常。
☆ synchronized修饰符对超类和子类的作用是独立的。
我们可以通过如下的例子来了解覆盖重载。
Myparent.java
public class Myparent {
public void printClassName () {
System.out.println ( “Myparent” );
}
}
Mychild.java
public class Mychild {
public void printClassName () {
System.out.println ( “Mychild” );
}
}
7.2 构造函数的重载 构造函数和其他的方法一样也可以被重载,由于它的特殊性,所以它的重载也与其他的方法重载有些不同。主要包括以下几个方面。
☆ 使用this调用自身的其余构造函数实现构造函数的名称覆盖。如下的示例:
public class Myclass {
String title ;
//Calling constructor
public Myclass () {
this ( “Default Title ” );
}
//Called constructor
public Myclass ( String t ) {
title = t ;
}
}
☆ 使用super调用超类的构造函数。需要注意的是,如果不显式的使用super调用超类的构造函数,系统会调用超类的不带参数的缺省构造函数。另外要使用this()或者super()则必须把它放在其构造函数的首行。如下的示例:
public class MySuper {
//first constructor
public MySuper () {
System.out.println (“Super1”) ;
}
//second constructor
public MySuper ( String title ) {
System.out.println (“Super2”) ;
}
}
public class MySub extends MySuper {
//first constructor
public MySub () {
super(“the title”)
System.out.println (“Sub1”) ;
}
//second constructor
public MySub ( String title ) {
System.out.println (“Sub2”) ;
}
}
7.3 所属Is和拥有Has关系 这里主要是提醒大家明白了一个我们在平时程序设计中经常混淆的概念,即所属Is和拥有Has关系的概念和区别。我们需要注意的是只有对于所属的这种关系,我们才可以使用子类和超类的程序设计思想。
阅读(1780) | 评论(0) | 转发(0) |