1.创建一个对象

好了,我们已经开始创建对象了。您之前已经遇到过这个问题,但现在我们将更详细地分析这个主题。创建对象其实很容易。

要创建对象,您需要使用new运算符。创建对象大致如下所示:

new Class(arguments)

创建一个对象后,我们通常会立即将对它的引用保存在一个变量中,该变量通常与创建的对象共享相同的类型。这意味着在创建一个对象时,你通常会看到这样的代码:

Class name = new Class(arguments)

哪里是创建一个新变量,等号右边的代码是创建一个类型为.的新对象。Class nameClass

例子:

代码 笔记
Object o = new Object();
创建Object对象
Cat pet = new Cat();
创建Cat对象
Scanner console = new Scanner(System.in)
创建Scanner对象

程序员通常以他们的类命名变量,但使用小写字母。对于新手程序员来说,这样的代码可能会令人困惑:

代码
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

这段代码没有任何问题——这是最普通的代码,其中创建了一个变量,然后立即由一个相同类型的对象对其进行初始化。

在等号的左边,我们创建了一个变量。右边是对象的创建。就是这样。

2.构造函数

您可能已经看到在创建对象时经常传递一些参数。更重要的是,参数是为某些对象传递的,而不是为其他对象传递的。整个带参数的机制是如何工作的?

这里的一切也很简单:每个类都有一个(或多个)特殊方法,负责处理创建对象时传递的参数。这些方法称为构造函数。或者当我们只谈论一个时:构造函数

将构造函数方法与常规方法区分开来很容易。这种方法有两个显着特点:

  • 构造函数的名称与其类的名称相同(并以大写字母开头)
  • 构造函数没有返回类型。

一般来说,它通常是这样的:

modifiers Class(arguments)
{
   Code
}

例子:

代码 笔记
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Point




Point类构造器
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




创建类的对象Point。将调用类构造函数。

注意构造函数的样子:它没有返回类型并且它的名称与类名相同。

还有一件事:看一下构造函数中的代码。构造函数的参数与类的字段同名:x 和 y。避免编造新的参数名称是标准做法。名称与类的字段名称相同。使用 this 关键字解决名称冲突。

3.调用构造函数

当使用new运算符和类似“new Class ( arguments )”的命令来创建新对象时,会发生两件事:

  • Java机器创建一个类型为Class的对象
  • Java 机器调用对象的构造函数并传入您的参数

作为程序员,您可以决定您的类应该有哪些构造函数,以及这些构造函数应该有哪些参数。

假设您决定创建一个类来跟踪动物收容所里的猫。那么你的Cat类可能看起来像这样:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
这是允许的
Cat cat = new Cat("Whiskers");
但这是不允许的 这段代码不会编译。
Cat cat = new Cat();
这是不允许的。这段代码不会编译。

该类Cat只有一个带有 name 和 age 参数的构造函数。因为没有其他构造函数,所以在创建对象时必须将猫的名字 ( name) 和年龄 ( ) 作为参数传递。age将参数传递给构造函数不是可选的

4.多个构造函数

但如果需要,您可以向类中添加多个构造函数。构造函数或其参数的数量没有限制。当你创建一个对象时,编译器会自动选择与参数匹配的构造函数

代码 笔记
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
这是允许的:将调用第一个构造函数
Cat cat = new Cat("Whiskers");
这是允许的:将调用第二个构造函数
Cat cat = new Cat();
但这是不允许的 这段代码不会编译。

我们决定考虑猫的年龄可能未知的事实。为了处理这种情况,我们添加了一个特殊常量UNKNOWN和一个只有一个参数的构造函数——猫的名字。

请注意,我们仍然在两个构造函数中初始化两个变量。我们用常量替换未知/缺失的参数UNKNOWN

如果没有为 age 变量赋值,那么它的默认值为 0。毕竟,在街上发现的一只小猫很可能是 0 整岁。这意味着年龄变量中的零并不一定意味着“未知年龄”。

5.默认构造函数

如果你想让你的对象在没有任何参数的情况下被实例化,你的类需要声明一个无参数的构造函数。

没有参数的构造函数不一定是没有代码的构造函数。这样的构造函数可以包含使用起始值初始化变量的代码:

代码 笔记
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
这是允许的:将调用第一个构造函数
Cat cat = new Cat();
这是允许的:将调用第二个构造函数

默认构造函数

有一点非常重要,您应该知道并记住。

如果您的类没有声明一个构造函数,编译器将添加一个默认构造函数,这是一个带有 public 修饰符的无参数构造函数。

但是,如果您的类甚至声明了一个构造函数,则不会添加默认构造函数,如果需要,您需要自己添加。

代码 笔记
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
这是允许的:将调用默认构造函数