Java中的类和对象

来源:互联网 发布:mac os x 5k原生壁纸 编辑:程序博客网 时间:2024/04/30 00:24

Java中的类和对象

了解如何使类,字段,方法,构造函数和对象在Java应用程序中协同工作

类,字段,方法,构造函数和对象是基于对象的Java应用程序的构建块。本文将教你如何声明类,通过字段描述属性,通过方法描述行为,通过构造函数初始化对象,以及从类实例化对象并访问它们的成员。在此过程中,您还将了解setters和getter,方法重载,设置字段,构造函数和方法的访问级别等。如果你想进一步与字段和方法,你还可以下载免费的Java 101引用显示常量,递归和其他技术在基于对象的编程。

什么是基于对象的应用程序?

基于对象的Java应用程序是一种Java应用程序,其设计基于声明类,从中创建对象以及设计这些对象之间的交互。


类声明

是制造对象的模板。您可以通过指定class关键字以及为其命名的非保留标识符来声明类。一对匹配的打开和关闭大括号({})跟随并分隔类的主体。此语法如下所示:

class identifier{   // class body}

按照惯例,类名称的第一个字母为大写,后续字符为小写(例如,Employee)。如果名称由多个字组成,每个单词的第一个字母为大写(例如SavingsAccount)。这种命名约定称为驼峰化

以下示例声明一个名为的类Book

class Book{   // class body}

类的主体填充有字段,方法和构造函数。将这些语言特征组合成类称为封装。这种能力使我们能够在更高层次的抽象(类和对象)中编程,而不是分别关注数据结构和功能。

实用程序类

类可以被设计为与对象制造无关。相反,它作为类字段和/或类方法的占位符存在。这样的类称为实用程序类。实用程序类的示例是Java标准类库的Math类。有关另一个示例,请参阅Java引领中的字段和方法。

多类应用程序和main()

Java应用程序由一个或多个类实现。小型应用程序可以由单个类来适应,但是更大的应用程序通常需要多个类。在这种情况下,其中一个类被指定为主类并包含main()入口点方法。例如,清单1给出了使用三个类构建的应用程序:ABCC是主类。

清单1.具有多个类的Java应用程序

class A{}class B{}class C{   public static void main(String[] args)   {      System.out.println("Application C entry point");   }}

您可以在单个源文件中声明这三个类,例如D.java。然后,您将编译此源文件,如下所示:

javac D.java

编译器生成三个类文件:A.classB.class,和C.class。通过以下命令运行此应用程序:

java C

您应该观察以下输出:

Application C entry point

或者,您可以在其自己的源文件中声明每个类。按照惯例,源文件的名称与类名称匹配。你将宣布AA.java,例如。然后,您可以单独编译这些源文件:

javac A.javajavac B.javajavac C.java

为了节省时间,您可以通过将文件名替换为星号(但保留.java文件扩展名)来一次编译所有三个源文件:

javac *.java

无论哪种方式,您都可以通过以下命令运行应用程序:

java C

公共类

Java允许您通过public关键字声明具有公共访问权限的类。当声明类public时,必须将其存储在具有相同名称的文件中。例如,你会存储public class C {}C.java。您可以public在源文件中只声明一个类。

当设计多类应用程序时,您将指定其中一个类作为主类,并main()在其中找到方法。但是,没有什么可以阻止你main()在其他类中声明方法,也许是为了测试目的。此技术如清单2所示。

清单2.声明多个main()方法

class A{   public static void main(String[] args)   {      System.out.println("Testing class A");   }}class B{   public static void main(String[] args)   {      System.out.println("Testing class B");   }}class C{   public static void main(String[] args)   {      System.out.println("Application C entry point");   }}

编译源代码后,您需要执行下面的命令来测试辅助类AB,并运行应用程序类C

java Ajava Bjava C

然后,您将观察以下输出行,每个java命令一行:

Testing class ATesting class BApplication C entry point

小心使用main()

main()在每个类中放置一个方法可能会让人困惑,特别是如果你忘记记录主类。此外,在将应用程序投入生产之前,您可能会忘记删除这些方法,在这种情况下,它们的存在会向应用程序添加批量。此外,有人可能运行一个支持类,这可能会中断应用程序的环境。

字段:描述属性

类在状态(属性)方面对真实世界实体进行建模。例如,车辆具有颜色,支票帐户具有余额。类也可以包括非实体状态。无论如何,状态存储在称为字段的变量。字段声明具有以下语法:

[static] type identifier [ = expression ] ;

字段声明可选地以关键字static(对于非实体属性)开头,type并且后面跟着一个非保留identifier字段,该字段命名字段。可以通过指定=后跟expression具有兼容类型的字段来显式初始化字段。分号终止声明。

以下示例声明了一对字段Book

class Book{   String title;   int pubYear; // publication year}

titlepubYear字段声明是相同的变量声明我提出了“ 的Java 101:初级Java语言特性。” 这些字段称为实例字段,因为每个对象都包含自己的副本。

titlepubYear领域的特定书店值。但是,您可能希望存储独立于任何特定图书的状态。例如,您可能想要记录Book创建的对象的总数。以下是您的操作方法:

class Book{   // ...   static int count;}

此示例声明一个count整数字段,用于存储Book创建的对象数。声明以static关键字开头,表示在内存中只有该字段的一个副本。每个Book对象可以访问此副本,没有对象有自己的副本。因此,count被称为类字段

初始化

前面的字段未分配值。当你不明确初始化一个字段时,它的隐含初始化的所有位设置为零。您将此默认值解释为false(for boolean),'\u0000'(for char),0(for int),0L(for long),0.0F(for float),0.0(for double)或null(对于引用类型)。

但是,也可以在声明字段时显式初始化字段。例如,您可以指定static int count = 0;(这是没有必要的,因为count默认为0), ,String logfile = "log.txt";static int ID = 1;甚至double sinPIDiv2 = Math.sin(Math.PI / 2);

虽然可以通过直接赋值来初始化一个实例字段,但是在构造函数中执行这个初始化更为常见,这将在后面演示。相反,类字段(特别是类常量)通常通过将表达式直接分配给字段来初始化。

寿命和范围

实例字段在其对象被创建时诞生,并在对象被垃圾回收时消失。类字段在类加载时生成,并在类卸载或应用程序结束时死机。此属性称为生存期

实例和类字段可以从它们的声明到它们的声明类的结尾。此外,当给定合适的访问级别时,它们仅在对象上下文中的外部代码(例如字段)或对象和类上下文(对于类字段)可访问。此属性称为范围

方法:描述行为

除了对真实世界实体的状态建模之外,类还对其行为进行建模。例如,车辆支持运动,并且支票账户支持存款和取款。类也可以包括非实体行为。无论如何,Java程序员使用方法来描述行为。方法声明具有以下语法:

[static] returnType identifier ( [parameterList] ){   // method body}

方法声明可以选择以关键字开头static(对于非实体行为),并继续使用一个方法returnType声明identifier,后面跟一个名为方法的非保留。然后名称后跟一个圆括号分隔的可选parameterList。一个括号分隔的主体,包含在调用方法时执行的代码。

返回类型标识从通过该方法返回值的类型return声明,我将在后面讨论。例如,如果一个方法返回字符串,它的返回类型将被设置为String。当方法不返回值时,其返回类型设置为void

参数列表是一个逗号分隔的参数声明列表:每个声明包含一个类型后跟一个非保留标识符名称参数。一个参数是接收一个变量参数(表达式值,其类型与对应的参数兼容)当一个方法或构造函数被调用。

参数是其方法或构造函数的本地参数。它在调用方法或构造函数时就存在,当方法或构造函数返回到其调用者时消失。换句话说,它的生命周期是方法执行。参数可以由方法中的任何代码访问。它的范围是整个方法。

以下示例声明Book类中的四个方法:

class Book{   // ...   String getTitle()   {      return title;   }   int getPubYear()   {      return pubYear;   }   void setTitle(String _title)   {      title = _title;   }   void setPubYear(int _pubYear)   {      pubYear = _pubYear;   }}

getTitle()getPubYear()方法返回各自领域的价值。他们使用return语句将这些值返回给调用者。请注意,此语句的表达式的类型必须与方法的返回类型兼容。

setTitle()setPubYear()方法允许您设置的值titlepubYear领域。它们的返回类型设置为关键字void,以指示它们不向调用者返回任何值。所有四个方法都称为实例方法,因为它们只影响它们被调用的对象。

设置和吸气

在“ set”前缀标识setTitle(),并setPubYear()setter方法,这意味着它们设置的值。类似地,“ get”前缀标识getTitle()getPubYear()作为getter方法,这意味着它们获得值。

如果你想知道关于代替直接访问需要的setter / getter方法titlepubYear,你会发现在“一些很好的理由是什么getter和setter点?在StackOverflow.com”主题。

getTitle()getPubYear()setTitle(),和setPubYear()的方法影响的单个对象的副本titlepubYear领域。但是,您可能需要声明一个独立于任何特定图书的方法。例如,您可能需要引入一个输出Book对象数的方法,如下所示:

class Book{   // ...   static void showCount()   {      System.out.println("count = " + count);   }}

此示例声明一个showCount()方法,将输出count字段的值。声明以static关键字开头,表示此方法属于类,无法访问单个对象状态; 不需要创建对象。因此,showCount()被称为类方法

局部变量

在方法或构造函数中,您可以声明其他变量作为其实现的一部分。这些变量称为局部变量,因为它们是方法/构造函数的局部变量。它们仅在方法或构造函数执行时存在,并且无法从方法/构造函数外部访问。请考虑以下示例:

static void average(double[] values){   double sum = 0.0;   for (int i = 0; i < values.length; i++)      sum += values[i];   System.out.println("Average: " + (sum / values.length));}

此示例提供了一个名为average计算和输出doubles 数组的平均值的方法。除了参数values,它声明局部变量sumi帮助计算。sum其生命期和范围从其声明点到方法结束。i其生命周期和范围仅限于for循环。

0 0
原创粉丝点击