<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 说构造器是一个方法,就如同说澳洲鸭嘴兽是另外一种哺乳动物。要理解鸭嘴兽,重要的是要知道它与其它哺乳动物的不同之处。理解构造器,知道其与一个方法是怎样的不同也是同样重要的。每一个学习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调用 调用
澳洲鸭嘴兽--构造器
最新推荐文章于 2024-08-18 21:36:31 发布