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)
Scanner
console
在第二行中,我们使用存储对象引用的变量调用对象nextInt()
的方法。Scanner
console
Scanner
对象创建示例:
代码 | 描述 |
---|---|
|
创建String 对象 |
|
创建Scanner 对象 |
|
创建一个:元素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();
这是执行此代码后内存中的内容:
所以请随意将您的字符串传递给任何方法:没有人会更改它们。
GO TO FULL VERSION