澳洲鸭嘴兽--构造器

本文详细阐述了JAVA中构造器与方法的区别,包括它们的目的、标记、使用this和super关键字的不同,以及在继承和编译器支持方面的差异。
<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调用 调用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值