1.对象

Java 中的一切都是对象。

更准确地说,Java 中很少有不是对象的东西。例如,原始类型。但这是一个相当罕见的例外。

那么什么是对象呢?

对象是将数据与处理数据的方法组合在一起的实体。当我们说“数据”时,当然是指变量。

对象的变量称为它的“数据”或“状态”。

一个对象的方法被称为它的“行为”。通常仅使用对象的方法来更改对象的状态(变量)。直接更改对象的变量(不使用其方法)被认为是错误的形式。

每个对象,以及每个变量,都有一个类型。该类型在创建对象时确定一次,以后不能更改。一个对象的类型就是它的类。

每个对象都有自己的实例变量(字段)副本。如果在类中声明了一个非静态 int a 变量,并且您的程序创建了该类的 10 个对象,那么每个对象都会有自己的 int a 变量。

与对象交互

使用对象最方便的方法是将对它的引用存储在变量中,然后调用该变量的方法。这对你来说很熟悉:

variable.method()

其中variable是存储对象引用的变量,method是该类的方法。

如果你想引用一个对象的字段(变量),那么你还需要使用点运算符

variable.field

其中variable是存储对象引用的变量,field是实例变量(字段)。


2.new操作员

要创建某个类的对象,需要使用new运算符。通常,创建对象的过程如下:

Class variable = new Class(arguments);

其中Class是变量的类名variable以及要创建的对象的类名。Andvariable 是一个变量,它存储对创建的对象的引用。Andarguments是传递给构造函数的以逗号分隔的参数列表的占位符。

可以传递的具体参数列表由编写该类的程序员决定。

您以前创建过对象,甚至使用过这个特定的构造。你没有忘记,我希望?

Scanner console = new Scanner(System.in);
int x = console.nextInt();

Scanner console— 这将创建一个console类型为Scanner. — 这会创建一个新对象。并且赋值运算符将变量设置为等于对新创建对象的引用。new Scanner(System.in)Scannerconsole

在第二行中,我们使用存储对象引用的变量调用对象nextInt()的方法。ScannerconsoleScanner

对象创建示例:

代码 描述
String s = new String("Hello");
创建String对象
Scanner console = new Scanner("");
创建Scanner对象
int[] data = new int[10];
创建一个:元素int[]的容器10 int

创建的对象称为类的对象类的实例,而类称为对象的类。例如,s变量存储对类实例的引用String



3.引入类

我想您已经看到使用其他程序员编写的类是多么方便。但是如何编写自己的类呢?

您如何知道何时何地需要自己的课程以及如何制作课程?

当程序员想在程序中引入新实体时,他们通常会创建自己的类。这听起来令人困惑吗?然后我会尝试解释,但我将从很远的地方开始。

数据组

稍微简化一下,我们可以说 Java 中的对象是一块内存,其中包含类中声明的变量(实例字段)。或者,换句话说,变量组合成一个组。

假设您的程序需要存储100点的坐标并需要一种方法将它们显示在屏幕上。这可以使用数组来完成。例如,像这样:

class Solution
{
   public static void printPoints(int[] x, int[] y, int[] color)
   {
     for (int i = 0; i < x.length; i++)
       System.out.println("Color of (" + x[i] + ", " + y[i] + ") = " + color[i]);
   }

   public static void main(String[] args)
   {
     int[] x = new int[100];
     int[] y = new int[100];
     int[] color = new int[100];
     printPoints(x, y, color);
   }
}

如果我们有一个单一的类型来存储关于一个点的所有信息,那就更方便了:x, y, color。如果 Java 中不存在这样的类型,您可以自己创建它。

为此,我们将为一个Point类编写代码:

public class Point
{
   public int x;
   public int y;
   public int color;
}

现在上面的代码可以重写为:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Color of (" + points[i].x + ", " + point[i].y + ") = " + points[i].color);
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

现在让我们在Point类中添加一个方法来显示有关对象的信息:

public class Point
{
   public int x;
   public int y;
   public int color;
   public void print()
   {
     System.out.println("Color of (" + x + ", " + y + ") = " + color);
   }
}

现在Solution类看起来像这样:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       points[i].print();
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

我们巧妙地将点的坐标和颜色信息Point以及显示点状态的方法隐藏在类中。

类是管理程序复杂性的一种方式。当一个大程序被分解成许多小类时,它变得不那么复杂。


4. 可变对象与不可变对象

曾几何时,我们研究了 Java 中的常量,得出了一个不太令人欣慰的结论。常量可让您保护变量不被更改,但它们无法阻止对其引用的对象进行更改。

为了解决这个问题,Java 想出了常量对象。或者,它们更常被称为不可变对象。

顺便说一下,你已经知道这样一个类,它的对象不能被改变:String。对象String在创建后将永远保持不变。Java 的创造者是如何做到这一点的?

首先,String类的所有变量都是隐藏的,即声明的private

其次,您不能继承该类String:它的类声明包含修饰符final

第三,也是最有趣的是,该类的所有方法String,在理论上,您希望更改现有对象,但实际上并没有更改它,而是返回一个新对象。

例如,该toUpperCase()方法使字符串中的所有字母大写。但是它并没有改变调用该方法的对象,而是返回一个String由大写字母组成的新对象:

String text = "This is a very important message";
String message = text.toUpperCase();

这是执行此代码后内存中的内容:

可变对象与不可变对象

所以请随意将您的字符串传递给任何方法:没有人会更改它们。