boring,阿廖沙,小牛在线-月光电影,精选影评,最佳评分,您的电影好伙伴

频道:最近大事件 日期: 浏览:215

在任何程序设计言语中,一项重要的特性便是姓名的运用。咱们创立一个目标时,会分配到一个保存区域的姓名。办法名代表的是一种详细的举动。经过用姓名描绘自己的体系,可使自己的程序更易人们了解和修正。它十分象写散文——意图是与读者交流。

咱们用姓名引证或描绘一切目标与办法。若姓名选得好,可使自己及其他人更易了解自己的代码。

将人类言语中存在详尽不同的概念“映射”到一种程序设计言语中时,会呈现一些特别的问题。在日常日子中,咱们用相同的词表达多种不同的意义——即词的“过载”。咱们说“洗衬衫”、“洗车”以及“洗狗”。但若强制象下面这样说,就显得很愚笨:“衬衫洗 衬衫”、“车洗 车”以及“狗洗 狗”。这是因为听众底子不需求对履行的举动作任何清晰的区别。人类的大多数言语都具有很强的“冗余”性,所以即便漏掉了几个词,依然能够推断出意义。咱们不需求绝无仅有的标识符——可从详细的语境中推论出意义。

大多数程序设计言语(特别是C)要求咱们为每个函数都设定一个绝无仅有的标识符。所以绝对不能用一个名为print()的函数来显现整数,再用另一个print()显现浮点数——每个函数都要求具有仅有的姓名。在Java里,另一项要素逼迫办法名呈现过载状况:构建器。因为构建器的姓名由类名决议,所以只能有一个构建器称号。但假若咱们想用多种办法创立一个目标呢?例如,假定咱们想创立一个类,令其用规范办法进行初始化,别的从文件里读取信息来初始化。此刻,咱们需求两个构建器,一个没有自变量(默许构建器),另一个将字串作为自变量——用于初始化目标的那个文件的姓名。因为都是构建器,所以它们必须有相同的姓名,亦即类名。所以为了让相同的办法名随同不同的自变量类型运用,“办法过载”是十分要害的一项办法。一起,尽管办法过载是构建器必需的,但它亦可应用于其他任何办法,且用法十分便利。

在下面这个比如里,咱们向咱们一起展现了过载构建器和过载的原始办法:

//: Overloading.java 
// Demonstration of both constructor
// and ordinary method overloading.
import java.util.*;
class Tree {
int height;
Tree() {
prt("Planting a seedling");
height = 0;
}
Tree(int i) {
prt("Creating new Tree that is " + i + " feet tall"); height = i; }
void info() {
prt("Tree is " + height + " feet tall");
}
void info(String s) {
prt(s + ": Tree is " + height + " feet tall");
}
static void prt(String s) {
System.out.println(s);
}
}
public class Overloading {
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
Tree t = new Tree(i);
t.info();
t.info("overloaded method");
}
// Overloaded constructor: new Tree();
}
} ///:~

Tree既可创立成一颗种子,不含任何自变量;亦可创立成生长在苗圃中的植物。为支撑这种创立,共运用了两个构建器,一个没有自变量(咱们把没有自变量的构建器称作“默许构建器”,),另一个选用现成的高度。

咱们也有或许期望经过多种途径调用info()办法。例如,假定咱们有一条额定的音讯想显现出来,就运用 String自变量;而假定没有其他话可说,就不运用。因为为明显相同的概念赋予了两个独立的姓名,所以看起来或许有些乖僻。走运的是,办法过载答应咱们为两者运用相同的姓名。

区别过载办法

若办法有相同的姓名,Java怎样知道咱们指的哪一个办法呢?这里有一个简略的规矩:每个过载的办法都必须采纳绝无仅有的自变量类型列表。

若略微考虑几秒钟,就会想到这样一个问题:除依据自变量的类型,程序员怎么区别两个同名办法的差异呢?即便自变量的次序也满足咱们区别两个办法(尽管咱们一般不愿意选用这种办法,因为它会发生难以保护的代码):

/: OverloadingOrder.java 
// Overloading based on the order of
// the arguments.
public class OverloadingOrder {
static void print(String s, int i) {
System.out.println( "String: " + s + ", int: " + i);
}
static void print(int i, String s) {
System.out.println( "int: " + i + ", String: " + s);
}
public static void main(String[] args) {
print("String first", 11);
print(99, "Int first");
}
} ///:~

两个print()办法有彻底一致的自变量,但次序不同,可据此区别它们。

返回值过载

咱们很易对下面这些问题感到利诱:为什么只要类名和办法自变量列出?为什么不依据返回值对办法加以区别?比如对下面这两个办法来说,尽管它们有相同的姓名和自变量,但其实是很简单区别的:

void f() {} int f() {} 

若编译器可依据上下文(语境)清晰判别出意义,比如在int x=f()中,那么这样做彻底没有问题。但是,咱们也或许调用一个办法,一起疏忽返回值;咱们一般把这称为“为它的副作用去调用一个办法”,因为咱们关怀的不是返回值,而是办法调用的其他作用。所以假设咱们象下面这样调用办法:

f(); 

Java怎样判别f()的详细调用办法呢?并且他人怎么辨认并了解代码呢?因为存在这一类的问题,所以不能依据返回值类型来区别过载的办法。

热门
最新
推荐
标签