第5章(1) 构造器

构造器是一个在创建对象时被自动调用的特殊方法。

1. 构造器的命名

构造器采用与类相同的名称。这么做的意义在于:

(1). 避免与类的某个成员的名称冲突。

(2)让编译器自己知道应该调用那个方法。

2. 构造器是一种特殊的方法:

创建对象时,会为对象分配存储空间,同时调用相应的构造器,以确保对象得到恰当的初始化。

无参构造器又叫做默认构造器,当没有为类提供任何的构造器时,编译器会自动帮你创建一个默认构造器。当然我们也可以自己添加带参数的构造器,可以用于在初始化对象的时候提供参数。

注意下面的例子:

class Rock {
  Rock(int i) {
    System.out.println(
      "Creating Rock number " + i);
  }
}

public class SimpleConstructor {
  public static void main(String[] args) {
    for(int i = 0; i < 10; i++)
      new Rock(i);
  }
}

这时构造器可以接受参数来创建一个Rock对象。但同时,Rock(int)是Rock类中唯一的构造器,编译器将不允许你以其他任何方式创建Rock对象,如new Rock()会有报错。

构建器属于一种较特殊的方法类型,因为它没有返回值。new表达式确实返回了对新建对象的引用,但构造器本身并没有任何的返回值。

 

方法重载

为了让方法名相同而形式参数不同的构造器同时存在,必须用到方法重载。

每个重载的方法都必须有一个独一无二的参数类型列表。

注意:

(1). 对涉及基本类型的重载,方法接受较小的基本类型作为参数的时候,较小类型会向较大类型自动提升,这种情况可能造成一些混淆,如下面的例子:

存在void f(int),传入char型参数,如果找不到恰好接受char参数的方法,就会直接把char型提升为int型。

(2). 如果传入的实际参数较大,就得通过类型转换来执行窄化转换,否则编译器会报错。

this关键字

this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。

this关键字对于将当前对象传递给其他方法也很有用:

class Person{
public void eat(Apple apple) {
Apple peeled = apple.getPeeled();
System.out.println("Yummy");
}
}

class Peeler {
static Apple peel(Apple apple) {
// ... remove peel
return apple; // Peeled
}
}

class Apple {
Apple getPeeled() {
return Peeler.peel(this);
}
}
public class PassingThis {
public static void main(String[] args) {
new Person().eat(new Apple());
}
}

这样的用法出现在peel这个方法应用于许多不同的类,而你有不想重复这些代码。

在构造器中调用构造器

如果为this添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用

在构造器中可以用this调用一个构造器,且必须将构造器置于最起始位置,否则编译器会报错。除了构造器外,编译器禁止在其他任何方法中调用构造器。

实际应用看下面的例子:

//: Flower.java
// Calling constructors with "this"

public class Flower {
  private int petalCount = 0;
  private String s = new String("null");
  Flower(int petals) {
    petalCount = petals;
    System.out.println(
      "Constructor w/ int arg only, petalCount= "
      + petalCount);
  }
  Flower(String ss) {
    System.out.println(
      "Constructor w/ String arg only, s=" + ss);
    s = ss;
  }
  Flower(String s, int petals) {
    this(petals);
//!    this(s); // Can't call two!
    this.s = s; // Another use of "this"
    System.out.println("String & int args");
  }
  Flower() {
    this("hi", 47);
    System.out.println(
      "default constructor (no args)");
  }
  void print() {
//!    this(11); // Not inside non-constructor!
    System.out.println(
      "petalCount = " + petalCount + " s = "+ s);
  }
  public static void main(String[] args) {
    Flower x = new Flower();
    x.print();
  }
} ///:~

static的含义:

static方法就是没有this的方法,在static方法内部不能调用非静态方法,反过来倒是可以的。

时间: 2024-10-02 09:59:30

第5章(1) 构造器的相关文章

第二章 IoC 构造器注入

UserDao与UserDaoImpl: public interface UserDao { public void save(); } public class UserDaoImpl implements UserDao { public void save() { System.out.println("保存用户..."); } } UserService接口及其实现类UserServiceImpl: public interface UserService { public

《JavaScript设计模式》——第9章 JavaScript设计模式9.1 Constructor(构造器)模式

第9章 JavaScript设计模式 在本章中,我们将探索一些经典与现代设计模式的JavaScript实现. 开发人员通常想知道他们是否应该在工作中使用一种"理想"的模式或模式集.这个问题没有明确的唯一答案,我们研究的每个脚本和 Web 应用程序可能都有它自己的个性化需求,我们需要思考模式的哪些方面能够为实现提供实际价值. 例如,一些项目可能会受益于观察者模式提供的解耦好处(这可以减少应用程序的某些部分对彼此的依赖度),而有些项目可能只是因为太小,而根本无需考虑解耦. 也就是说,一旦我

Swift构造器重载

与函数一样,方法也存在重载,其重载的方式与函数一致.那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的.一.构造器重载概念Swift中函数重载的条件也适用于构造器,条件如下:函数有相同的名字:参数列表不同或返回值类型不同,或外部参数名不同:Swift中的构造器可以满足以下两个条件,代码如下: class Rectangle { var width : Double var height : Double init(width : Double, height : Double) { ① s

第九章 方法[《.net框架程序设计》读书笔记]

.net框架|笔记|程序|设计 第九章 方法 一. 实例构造器 1. 前面提到用new操作符创建对象时的三部曲: l 为对象分配内存 l 初始化对象的附加成员(方法表指针和SyncBlockIndex) l 调用实例构造器初始化实例状态 在分配内存时,系统将所有内存位置均置为0值,这就是为什么字段初始化而未赋值时均为0或null值. 不调用实例构造器的情况: l 调用Object.MemberwiseClone()方法创建实例(分配内存:初始化附加成员:将源对象字节拷贝到新创建的对象) l 反序

第十五章 接口[《.net框架程序设计》读书笔记]

.net框架|笔记|程序|设计 第十五章 接口 摘要: 接口的应用及完全限定名方式定义接口的应用. 一. 接口与继承 l C#支持单实现继承和多接口继承 l 接口中可以定义:事件.无参属性(属性).含参属性(索引器):C#不允许接口定义任何静态成员(CLR却允许定义静态成员):CLR不允许接口定义实例字段和构造器. l 缺省为public abstract 方法,但不可用任何修饰符进行修饰(包括public) l 将值类型转换为接口类型(假设其实现了某个接口),则值类型被装箱为引用类型,以调用其

《Java 7并发编程实战手册》第六章并发集合

由人民邮电出版社出版的<Java 7并发编程实战手册>终于出版了,译者是俞黎敏和申绍勇,该书将于近期上架.之前并发编程网组织翻译过此书,由于邮电出版社在并发网联系他们之前就找到了译者,所以没有采用并发网的译稿,但邮电出版社将于并发网展开合作,发布该书的样章(样章由并发网挑选,你也可以回帖告诉我们你想看哪一章的样章),并组织赠书活动回馈给活跃读者.活动详情请时刻关注并发网的微博和微信(微信号:ifeves),最后祝各位用餐愉快!:) 本章将介绍下列内容: 使用非阻塞式线程安全列表 使用阻塞式线程

《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

1.4 与JVM的无缝集成 深入理解Scala Scala的吸引力之一在于它与Java和JVM的无缝集成.Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类.这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的.在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里. 1.4.1 Scala调用Java 从S

JavaScript ECMA-262-3 深入解析.第三章.this_javascript技巧

介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节.讨论的主题就是this关键字. 实践证明,这个主题很难,在不同执行上下文中确定this的值经常会发生问题. 许多程序员习惯的认为,在程序语言中,this关键字与面向对象程序开发紧密相关,其完全指向由构造器新创建的对象.在ECMAScript规范中也是这样实现的,但正如我们将看到那样,在ECMAScript中,this并不限于只用来指向新创建的对象. 下面让我们更详细的了解一下,在ECMAScript中this的值到底是什么? 定义 t

《Java 7并发编程实战手册》第四章线程执行器

感谢人民邮电大学授权并发网发布此书样章,新书购买传送门=>当当网 本章将介绍下列内容: 创建线程执行器 创建固定大小的线程执行器 在执行器中执行任务并返回结果 运行多个任务并处理第一个结果 运行多个任务并处理所有结果 在执行器中延时执行任务 在执行器中周期性执行任务 在执行器中取消任务 在执行器中控制任务的完成 在执行器中分离任务的启动与结果的处理 处理在执行器中被拒绝的任务 4.1 简介 通常,使用Java来开发一个简单的并发应用程序时,会创建一些 Runnable 对象,然后创建对应的 Th