1.创建一个对象
好了,我们已经开始创建对象了。您之前已经遇到过这个问题,但现在我们将更详细地分析这个主题。创建对象其实很容易。
要创建对象,您需要使用new运算符。创建对象大致如下所示:
new Class(arguments)
创建一个对象后,我们通常会立即将对它的引用保存在一个变量中,该变量通常与创建的对象共享相同的类型。这意味着在创建一个对象时,你通常会看到这样的代码:
Class name = new Class(arguments)
哪里是创建一个新变量,等号右边的代码是创建一个类型为.的新对象。Class name
Class
例子:
代码 | 笔记 |
---|---|
|
创建Object 对象 |
|
创建Cat 对象 |
|
创建Scanner 对象 |
程序员通常以他们的类命名变量,但使用小写字母。对于新手程序员来说,这样的代码可能会令人困惑:
代码 |
---|
|
|
|
这段代码没有任何问题——这是最普通的代码,其中创建了一个变量,然后立即由一个相同类型的对象对其进行初始化。
在等号的左边,我们创建了一个变量。右边是对象的创建。就是这样。
2.构造函数
您可能已经看到在创建对象时经常传递一些参数。更重要的是,参数是为某些对象传递的,而不是为其他对象传递的。整个带参数的机制是如何工作的?
这里的一切也很简单:每个类都有一个(或多个)特殊方法,负责处理创建对象时传递的参数。这些方法称为构造函数。或者当我们只谈论一个时:构造函数。
将构造函数方法与常规方法区分开来很容易。这种方法有两个显着特点:
- 构造函数的名称与其类的名称相同(并以大写字母开头)
- 构造函数没有返回类型。
一般来说,它通常是这样的:
modifiers Class(arguments)
{
Code
}
例子:
代码 | 笔记 |
---|---|
|
Point 类Point 类构造器 |
|
创建类的对象 Point 。将调用类构造函数。 |
注意构造函数的样子:它没有返回类型并且它的名称与类名相同。
还有一件事:看一下构造函数中的代码。构造函数的参数与类的字段同名:x 和 y。避免编造新的参数名称是标准做法。名称与类的字段名称相同。使用 this 关键字解决名称冲突。
3.调用构造函数
当使用new运算符和类似“new Class ( arguments )”的命令来创建新对象时,会发生两件事:
- Java机器创建一个类型为Class的对象
- Java 机器调用对象的构造函数并传入您的参数
作为程序员,您可以决定您的类应该有哪些构造函数,以及这些构造函数应该有哪些参数。
假设您决定创建一个类来跟踪动物收容所里的猫。那么你的Cat
类可能看起来像这样:
|
|
|
这是允许的 |
|
但这是不允许的 这段代码不会编译。 |
|
这是不允许的。这段代码不会编译。 |
该类Cat
只有一个带有 name 和 age 参数的构造函数。因为没有其他构造函数,所以在创建对象时必须将猫的名字 ( name
) 和年龄 ( ) 作为参数传递。age
将参数传递给构造函数不是可选的。
4.多个构造函数
但如果需要,您可以向类中添加多个构造函数。构造函数或其参数的数量没有限制。当你创建一个对象时,编译器会自动选择与参数匹配的构造函数
代码 | 笔记 |
---|---|
|
|
|
这是允许的:将调用第一个构造函数 |
|
这是允许的:将调用第二个构造函数 |
|
但这是不允许的 这段代码不会编译。 |
我们决定考虑猫的年龄可能未知的事实。为了处理这种情况,我们添加了一个特殊常量UNKNOWN
和一个只有一个参数的构造函数——猫的名字。
请注意,我们仍然在两个构造函数中初始化两个变量。我们用常量替换未知/缺失的参数UNKNOWN
。
如果没有为 age 变量赋值,那么它的默认值为 0。毕竟,在街上发现的一只小猫很可能是 0 整岁。这意味着年龄变量中的零并不一定意味着“未知年龄”。
5.默认构造函数
如果你想让你的对象在没有任何参数的情况下被实例化,你的类需要声明一个无参数的构造函数。
没有参数的构造函数不一定是没有代码的构造函数。这样的构造函数可以包含使用起始值初始化变量的代码:
代码 | 笔记 |
---|---|
|
|
|
这是允许的:将调用第一个构造函数 |
|
这是允许的:将调用第二个构造函数 |
默认构造函数
有一点非常重要,您应该知道并记住。
如果您的类没有声明一个构造函数,编译器将添加一个默认构造函数,这是一个带有 public 修饰符的无参数构造函数。
但是,如果您的类甚至声明了一个构造函数,则不会添加默认构造函数,如果需要,您需要自己添加。
代码 | 笔记 |
---|---|
|
|
|
这是允许的:将调用默认构造函数 |
GO TO FULL VERSION