第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方法内部不能调用非静态方法,反过来倒是可以的。

目录
相关文章
|
10月前
|
人工智能 算法 芯片
《C++与 ASIC 芯片:人工智能领域的强力搭档》
在AI发展中,C++与ASIC芯片的协同应用成为关键探索方向。C++以其高性能和对底层硬件的精细控制,与ASIC芯片的高度优化计算能力相结合,共同推动AI系统在性能、能效上的突破,特别是在智能安防、自动驾驶等领域展现巨大潜力。
172 11
|
算法 前端开发 NoSQL
追忆四年前:一段关于我被外企CTO用登录注册吊打的不堪往事
是的,诸位没有看错,这篇文章的要讲述的并不是我吊打面试官,而是一段我被面试官吊打的陈年往事,这段痛苦的记忆在我脑海中长久不衰,也是一个我内心曾多次不愿面对的事实,各位看官可以准备好一小把瓜子,听我将这则旧事缓缓道来~
559 59
追忆四年前:一段关于我被外企CTO用登录注册吊打的不堪往事
|
10月前
|
存储 安全 算法
陪玩系统功能 陪玩平台 陪玩系统用户体验 陪玩系统安全性 陪玩系统开发
陪玩系统旨在为用户寻找合适的陪玩者,提供注册登录、资料展示、搜索匹配、预约支付、实时沟通及评价反馈等功能。平台拥有丰富的陪玩资源,便捷的预约流程,安全的支付环境和良好的用户体验。系统通过优化算法、提升沟通效率、丰富服务内容和建立社区互动来提升用户体验。安全性方面,系统采用数据加密、防火墙、支付安全和实名认证等措施。开发过程包括需求分析、系统设计、前后端开发、测试优化和上线推广。
877 2
|
弹性计算
阿里云ECS云服务器更换公网IP的方法
阿里云ECS云服务器可以更换公网IP吗?当然可以,更换公网IP是有条件的有时间限制的,分两种情况,请听云服务器吧娓娓道来: ECS云服务器可以更换公网IP吗? 当然可以!在实际的更换IP场景中,主要有两种情况,一种情况是ECS创建6小时内更换公网IP,另一种是ECS实例创建超过6小时后更换公网IP: 情况一:ECS创建6小时内更换公网IP 新购的ECS云服务器,在创建6小时内可以免费更换公网IP,最多更换3次。
24799 1
|
Ubuntu Linux Shell
适用于 Linux 的 Windows 子系统(WSL)安装指南
适用于 Linux 的 Windows 子系统(WSL)安装指南
805 0
适用于 Linux 的 Windows 子系统(WSL)安装指南
|
Shell C语言 C++
MSYS2编译C/C++程序
MSYS2编译C/C++程序
1147 0
|
5G Shell 流计算
【无线网络】下载速度:2G、3G、4G和5G到底意味着什么?
【无线网络】下载速度:2G、3G、4G和5G到底意味着什么?
|
弹性计算
阿里云服务器续费优惠券免费领取(ECS和轻量均可)
阿里云服务器续费优惠券300元免费领取,云服务器ECS和轻量应用服务器均可,还可以享受自动包年续费优惠折扣
700 0
阿里云服务器续费优惠券免费领取(ECS和轻量均可)
|
Arthas Web App开发 网络协议
线上问题排查,一不小心踩到阿里的 arthas坑了
线上问题排查,一不小心踩到阿里的 arthas坑了
810 0
线上问题排查,一不小心踩到阿里的 arthas坑了