一起学习
说构造器是一个方法,就如同说澳洲鸭嘴兽是另外一种哺乳动物。要理解鸭嘴兽,重要的是要知道它与其它哺乳动物的不同之处。理解构造器,知道其与一个方法是怎样的不同也是同样重要的。每一个学习JAVA的学生,特别是为通过考试认证的学生,需要知道这些不同点;在这篇文章中,我要把它讲清楚。这篇文章的最后的表一总结了构造器、方法的关键不同之处。
目的与功能
构造器存在的目的:创造一个类的一个实例。也可以被调用来创造一个对象,如:
Platypus p1=new Platypus();
相对照,方法的目的就很普通了。方法的基本功能是执行JAVA字节码。
标记不同
构造器和方法在标记的三个方面不同:标示符,返回类型和名字。同方法一样,构造器可以有访问标示符的任何一个:public, protected, private, 或者none(通常被包或友元调用)。同方法不同的是,构造器只能有访问标记符。因而,构造器不能被abstract, final, native, static, native , static, 或ynchronized标记。
返回类型也是十分不同的。方法可以有任何一个合法的返回类型,或在返回类型是void时没有返回类型。构造器没有返回类型,甚至void。
最后,就标记而说,方法和构造器有不同的名字。构造器有和类一样的名字;根据习惯,方法用与类名字不同的其它名字。如果JAVA程序遵循一般的习惯,方法以小写字母开头,构造器以大写字母开头。通常,构造器名字为名词,因为类的名字通常为名词;方法名字通常显示动作。
“this”的用法
构造器和方法在用关键词this时十分不同。方法用this去引用执行这个方法的类创造的实例。类方法不用this;类方法不属于类实例,所以将没有东西去引用。类方法属于类,而不属于一个类实例。构造器用this以不同的参数列表去引用同一个类中的另外一个构造器。请研究下面的代码:
public class Platypus
{
String name;
Platypus(String input)
{
name=input;
}
Platypus()
{
this(“John/Mary Doe”);
}
public static void main(String args[])
{
Platypus p1=new Platypus(“digger”);
Platypus p2=new Platypus();
}
}
在这段代码里有两个构造器。第一个构造器把一个字符串输给实例的名字。第二个构造器没有参数,用缺省的名字“John/Mary Doe”调用第一个构造器。
如果一个构造器用this,必须放在构造器的第一行;略这个规则将引起编译器编译对象。
“super”的用法
方法和构造器都用去引用母类,但方式不同。方法用去执行一个父类中的重载方法,正如下面例子说明:
class Mammal
{
void getBirthInfo()
{
System.out.println(“born alive.”);
}
}
class Platypus extends Mammal
{
void getBirthInfo()
{
System.out.println(“hatch from eggs”);
System.out.println(“a mammal normally is “);
Super.getBirthInfor();
}
}
在上面的程序中super.getBirthInfo()调用重载了父类Mammal中的的方法。
构造器用super去调用父类中的构造器。如果一个构造器用super,必须放在第一行;否则,编译器将报错。如下面的例子:
public class SuperClassDemo
{
SuperClassDemo()
{
}
class Child extends SuperClassDemo
{
Child()
{
super();
}
}
在上面的(有点琐细)例子中,构造器Child()包括了super调用,引起除子类以外父类SuperClassDemo的实例化。
编译器提供的代码
当编译器自动提供构造器代码时,JAVA编程新手可能会产生困惑。当你写了一个没有构造器的类时,这种情况就会发生;编译器将自动为你提供一个没有参数的构造器。这样,如当你写以下代码时:
public class Example
{
}
在功能上等同与如下代码:
public class Example
{
Example()
{
}
}
当构造器的第一行没用super(用零或更多的参数)时,编译器也自动提供代码。这种情况下,编译器自动插入super。这样,如果你写如下代码:
public class TestConstructors
{
TestConststructors()
{
}
}
功能上等同与如下代码:
public class TestConstructors
{
TestConstructors()
{
super;
}
}
目光敏锐的新手想知道当TestConstructor没有继承自任何一个类时,上面的程序怎么会调用其父类的构造器。答案是当你没有显式地继承一个类时,JAVA则自动继承Object类。如果没有显式地声明一个构造器,编译器则自动提供一个没有参数的构造器,并且当没有有显地调用super时,自动提供一个没有参数的super调用。所以下面两段代码在功能上相等:
public calss Example
{
}
和
public class Example
{
Example()
{
superr;
}
}
继承
下面的场景问题出在哪里?律师正在读A.Class. A.Class的家庭成员聚集在大大的会议桌旁,其中几个在轻轻地呜咽。律师读到“我,A.Class,把我所有的构造器留给我的孩子们。”
问题是构造器不能被继承。幸运的是A. Class的孩子们将会自动地继承父类的任何一个方法,所以类A. Class的孩子将不会变的赤贫。
记住,JAVA方法是可以继承的,构造器是不会被继承的。看看下面的例子:
public class Example
{
public void sayHi
{
System.out.println(“Hi”);
}
Example()
{
}
}
public class SubClass extends Example
{
}
类SubClass自动继承其父类中建立的方法sayHi 。然而构造器Examle()不会被SubClass类继承。
不同总结
正如鸭嘴兽不同于典型的哺乳动物,构造器也不同于方法;特别是在目的、标志和在用thist和super时。另外,构造器在继承与代码编译支持上也不同;下面的表对突出的不同点提拱了一个方便的总结。
话题 构造器 方法
目的 创造一个类的实例 执行JAVA语句
标识符 不能被abstract final native static 可以被abstract final native static
synchronized修饰 synchronized修饰
返回类型 没有返回类型,甚至void void或者一个合法的类型
名字 与类的名字一样,通常为名词 除类名外的名字,习惯上为
,习惯上第一个字母大写 小写字母开头,通常为动词名字
this 引用同一个类的另一个构造器。 引用所属类的一个实例。不能被static
如果用,必须放在构造器第一行 用
super 调用父类的构造器。如用,必须放在 调用父类中一个重载方法
构造器的第一行
继承 构造器不能继承 方法是继承的。
编译器自动 如果类没有构造器,一个没有参数的 不适用
提供默认的 构造器被提供
构造器
编译器自动 如果一个构造器调用super时 不适用
提供一个默 没有参数,一个没参数的
认父类构造器 super调用
调用
下载本文示例代码
澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器澳洲鸭嘴兽--构造器
阅读(139) | 评论(0) | 转发(0) |