【问题标题】:I'm having a hard time understanding Java objects and classes我很难理解 Java 对象和类
【发布时间】:2011-04-22 16:12:30
【问题描述】:

示例 1

/**
 *Program Name: Cis36L0411.java  
 *Discussion:   Class -- Data Members ONLY
 *                       Method Members ONLY
 */ 
class Cis36L0411 
{
  public static void main( String[] args )
  {
    DataOnly data1 = new DataOnly();        

    System.out.println( "DataOnly\tLIMIT\t\t" + data1.LIMIT );
    System.out.println( "\t\tintMem\t\t" + data1.iMem );
    System.out.println( "\t\tdoubleMem\t" + data1.dMem );

    MethodOnly method1 = new MethodOnly();  

    method1.printFunc( 5 );
    method1.printFunc( "MethodOnly object!" );

    method1.printFunc( data1.LIMIT );

    return;
 }
}

class DataOnly
{
  final int LIMIT = 100; //constant and package mode or access
  int iMem;              //package mode or access
  double dMem;           //package mode or access
}

class MethodOnly
{
  void printFunc( int iA ) //package mode or access
  {
    System.out.println( "The int value is " + iA );

    return;
  }

  public void printFunc( String str ) //public mode or access
  {
   System.out.println( "The String is printed from  " + str );

    return;
  }
}

我去了this site并阅读了它,但我仍然感到困惑。

  1. DataOnly data1 = new DataOnly(); 我知道这一行创建了一个对象。但是有人可以为我打破这条线吗?每个词的作用是什么? DataOnly 上课了吗?类型? data1 是变量吗?我认为new DataOnly 是对位置的引用。 () 是位置中的变量吗?我说的对吗?

  2. 他们如何打印data1.LIMITdata1.iMemData1.dMem?他们是通过查看DataOnly() 的位置来打印的吗? DataOnly() 是否引用类 DataOnly

  3. 我完全迷失了MethodOnly对象的整个过程。

【问题讨论】:

  • 顺便说一句:坚持下去。这是一开始大多数编程学生都会遇到的事情之一,但在与他们一起工作一段时间后,它就会成为第二天性。
  • @Johnfx 是的,我正在尽力理解它,因为我必须执行以下操作 :( 问题 1:设计和实现一个 Student 类,它具有 - 数据成员:studendID、studentName 和 studentGrade - 构造函数:Student (int id, String name),它将studentID设置为参数“id”,将studentName设置为参数“name”(studentID = id; studentName = name) - 方法成员:setGrade()、getGrade()、 getName( ) 和 getID( )
  • 问题 2:实现一个具有“主”功能的测试类。 “main”函数将从上面的 Student 类中创建 4 个学生对象,其中包含 id 和名称:1,Bill; 2、玛丽; 3、詹姆斯; 4、Helen,将他们的成绩设置为A、B、C、D。main()函数会输出:ID:Name:Grade 1:Bill:A 2:Mary:B 3:Jame​​:C 4:Helen:D
  • @Johnfx 你不能不做问题 2 就做问题 1 对吧?
  • @CuriousStudent - 是的,这是正确的。问题 2 需要调用您为问题 1 编写的代码。

标签: java class object


【解决方案1】:

这个例子中有很多概念。看更简单的可能是明智的。但我会尽力解释。

第一个问题: 我们先来看看这个:

class DataOnly
{
  final int LIMIT = 100; //constant and package mode or access
  int iMem;              //package mode or access
  double dMem;           //package mode or access
}

这是一堂课。将其视为可用于创建对象的蓝图。 (更准确地说,蓝图应该被称为类型)。重要的是要理解一个类本身不是对象。我们可以创建多个具有相同类型的对象。

DataOnly data1 = new DataOnly();

你是对的,这条线创建了一个对象。 DataOnly 是一个类型,data1 是一个引用(稍后会详细介绍)。 DataOnly data1 表示data1 将是对创建以匹配DataOnly 类型的对象的引用。 new DataOnly 表示我们正在使用我们定义的“蓝图”创建一个对象。对象会在哪里?它将存储在内存中的某个位置,我们的引用data1 将为我们保存内存中的那个位置(内存地址)。每当我们想对我们的对象做某事时,我们使用这个引用在内存中到达它。我们可以创建一个 data2 对象,该对象将放置在内存中的其他位置,并更改其成员。它们不会以任何方式影响 data1,因为类是“蓝图”,对象是我们使用该蓝图创建的东西。

() 表示我们正在调用一个无参数的构造函数。

关于你的第二个问题:如果你理解我之前的解释,那么这个应该没问题。我们想对对象做点什么——打印它的成员。好的,我们有我们的参考。 .(点)用于访问对象的某些部分。 data1.LIMIT 最终将意味着我们获取 data1 引用的对象并查看它的 LIMIT 成员。

第三个问题:对象不仅可以保存信息,还可以做事。例如,您以前可能使用过 CD 播放器。如果您查看它,您可以看到当前 CD 有多少曲目。但不仅如此,您可以按下播放按钮,它会为您播放歌曲。让我们看看它在 Java 中的样子。

class CDPLayer
{
    public int numberOfTracks = 12;

    public void play()
    {
        System.out.println("I'm playing! Yay!");
    }
}

这是一个简单的CD播放器,里面的CD没办法换:)

一个对象拥有的事情是它的成员,它可以做的事情是它的方法。我们非常简单的 CD 播放器有许多曲目并且可以播放。方法和成员同样是对象的一部分,因此我们可以将两者与点 . 一起使用来访问它们。 (记住,对象与类不同)

此时你大概会理解下面的代码:

CDPlayer player = new CDPlayer(); 
System.out.println("The number of tracks is " + player.numberOfTracks);
player.play();

我们创建一个 CDPlayer,然后打印其中的曲目数量。然后我们使用它的play 方法。

在您的示例中,MethodOnly 类声明了两个具有相同名称的方法。这可能会令人困惑,但编译器不会通过名称来确定使用哪个方法,而是通过签名来确定。该方法的签名包括它的返回类型、它的名称和它的所有参数。当您拨打printFunc 时会发生什么?编译器会查看您传递的参数的类型,并会尽力找到与之匹配的方法。

第一次调用时带有参数5,它是一个整数,简称int。编译器选择带有 int 参数的 printFunc

第二次使用“字符串文字”调用它,因此编译器选择带有字符串参数的 printFunc

第三次使用变量调用它。它是哪个变量?它是 data1 的 LIMIT 成员。我们去检查蓝图以查看其类型:final intfinal 很棘手,在不同的上下文中可能意味着不同的东西。这一次意味着变量在程序中只能设置一次,以后不能更改。那么现在怎么办?编译器选择哪个 printFunc?没有final int 版本。正如我之前所说,编译器试图找到最好的,在这种情况下,一个简单的 int 参数就足够了。如果找不到足够好的匹配,它将停止并打印错误消息。

【讨论】:

  • 非常感谢您抽出宝贵的时间来回答!现在我只需要消化这个。
【解决方案2】:

在这段代码中:

DataOnly data1 = new DataOnly();

第一个DataOnly 是类型,data1 是对象特定的名称。 new DataOnly() 仅表示您将 data1 设置为 DataOnly 类的新实例。 “()”指定要发送到构造函数的参数(在本例中为无)以修改 DataOnly 的特定实例 data1

我不太明白你的第二个问题。

希望这会有所帮助。

【讨论】:

  • 你几乎是对的。 data1 只是一个包含对象“名称”的变量(即对象的句柄)。它不包含对象本身,也不是名称。 (有很多方法可以获得对象的“真实名称”,但您几乎不需要它,因为您实际上不能用它做很多事情。)这很重要,因为它对于理解赋值和将对象作为论据。
  • @Donal Fellows 我想我误解了“名字”到底是什么。我对Java相当陌生,但我想我还是会试一试这个问题。在我说“名称”的地方,我现在看到正确的术语是“句柄”,但我不太明白您所说的“真实名称”是什么意思。
  • “真实姓名”是对象身份的一个标记,在对象的整个生命周期中固有地无法改变。它可以被认为是“地址”,但那也不是真的;如果需要,Java 运行时可以重新排列对象在内存中的位置。 System.identityHashCode() 的结果是对象真实名称的视图。您并不经常明确需要它。
  • 我想我现在明白了。谢谢多纳尔!
【解决方案3】:

您可能需要查看Java Trails。特别是,Learning the Java Language 线索以对 Java 中使用的对象和类的全面概述开始。

【讨论】:

    【解决方案4】:

    因为我们在这里讨论的是非常基本的面向对象的原则,所以我将忽略对给出的示例进行分解。这样看 - 你有 5 个基本概念需要理解:

    • Class - (如 JohnFx 所述)蓝图中的一个类。一个类比是你房子的蓝图。它描述了房屋建成后的外观、加热或冷却方式、卧室数量等。

    • 对象 - 对象是您分配一些内存空间并根据特定类设置它时得到的。在这种情况下经常使用实例这个词。即“类的实例”。它实际上意味着同样的事情。

      所以,从房子蓝图(类)我们现在可以建造房子(对象)。您可以从一个蓝图(类)创建许多对象(实例)。例如,街道上的每一所房子都可能是由相同的蓝图创建的。 “new MethodOnly()”是一个例子,你如何从 java 中的类创建一个对象。

    • 变量 - 变量是指向一个对象的东西,当你需要做某事时如何找到它。也就是说,如果你想睡在你的房子里,你需要先找到你的房子。您的街道地址(变量)是您查找房子时所查找的地址。街道上的每一所房子都有自己独特的街道地址。

      此外,您可以有多个变量都指向同一个对象。即,如果您在笔记本中记录了您家的街道地址,您可以将其复印一份并交给其他人,以便他们过来参加聚会。现在有两个(变量)音符,都指向同一个房子。

      您会遇到两种有效的变量。一种用于引用刚刚讨论的对象。另一个用于包含单个值。通常是数字。这些被称为原始变量,因为它们不引用从类创建的对象。

    • 方法 - 方法是类可以做的事情。例如,您的代码中的void printFunc( int iA ) {...} 就是一个方法示例。它做某事。在我们的房屋类比中,您可以按下门铃来提醒某人您在前门。这是一个方法:void RingDoorBell()

    • 属性 - 最后是属性。这些看起来和闻起来像变量,它们确实如此。为什么它们被认为不同是因为它们被声明为类“蓝图”的一部分。您的 DataOnly 类是一个包含 3 个原始变量属性的示例。

      属性是使面向对象工作的因素之一。回到我们的房子,街道上的每个房子(对象/实例)可能来自同一个蓝图(类),但它们看起来都不同。不同的颜色、卧室数量等。卧室的颜色和数量是房屋类的属性。通过在建造房屋(实例化)时赋予它们不同的值,我们创造了变化。

      也可以改变房产的价值,就像人们将房子重新粉刷成不同的颜色一样。只要房子(对象)存在,它将保持设置为该值。

    【讨论】:

    • 谢谢!这帮助我以另一种方式理解基础知识
    【解决方案5】:
    1) DataOnly data1 = new DataOnly(); I know this line creates an object. 
    But can someone break this line down for me? What does each word do? 
    

    DataOnly =您想要其变量的类的名称。

    DataOnly data1 = 声明一个名为 data1 类型为 DataOnly 的变量

    new =关键字用于实例化一个类型的对象(实例化=创建)

    new DataOnly() = 实例化一个DataOnly 类型的对象,即根据DataOnly 类型的定义在堆上分配内存,并返回对该“实例”的引用,这就是data1 将指向的内容。

    DataOnly() = 在创建时调用的DataOnly 类型的默认构造函数

    2) How did they print data1.LIMIT, data1.iMem, Data1.dMem? 
    Did they print it by looking at the location of DataOnly()? 
    Does DataOnly() reference class DataOnly?
    

    构造完成后,data1 变量指向为 DataOnly 类型的对象(即具有 LIMIT、iMem 和 dMem 成员变量的对象)保留内存的位置。

    因此,当您在代码中执行 data1.LIMIT 时,请将 data1 视为对象的基内存地址,执行 .LIMIT 会将其偏移适当的值,以到达为该对象中的 LIMIT 变量保留的空间。

    同样适用于 iMem 和 dMem。

    偏移和到达正确内存位置以获取值等的逻辑对程序员来说都是不可见的

    3) I'm just completely lost on the whole process of the MethodOnly object
    

    MethodOnly 实际上是一个类而不是一个对象

    MethodOnly method1 = new MethodOnly();
    

    在上面的语句之后,method1 是 MethodOnly 类型的对象。

    MethodOnly 类更像是一个实用程序类,因为它没有任何自己的数据。 它的唯一目的是通过 int / string 类型的 2 种方法获取输入并打印出来。

    【讨论】:

      【解决方案6】:

      1) DataOnly data1 = new DataOnly();一世 知道这条线创建了一个对象。但 有人可以打破这条线 我?每个词的作用是什么?仅数据 是类?类型?数据1是 多变的?我认为新的 DataOnly 是 参考一个位置。而 () 是 位置的变量?我是不是 对吗?

      该行表示创建一个名为“data1”的 DataOnly 类型的变量。然后创建一个“DataOnly”类型的新对象,并使变量指向它。

      2) 他们是如何打印 data1.LIMIT 的, 数据1.iMem,数据1.dMem?他们打印了吗 它通过查看位置 仅数据()? DataOnly() 是否引用 类 DataOnly?

      DataOnly 只是对象(类)的模板。打印使用从该模板创建的内存中的对象来打印值。

      3) 我完全迷失了 MethodOnly的全过程 对象。

      根据创建对象的模板(类),对象既可以包含数据也可以执行功能。 MethodOnly 类似乎被定义为仅包含代码而不包含数据。 DataOnly 类似乎被定义为仅存储值而不执行任何操作。

      总结
      我认为最简单的想法是类是对象的蓝图。基于这些蓝图创建对象(使用“new”关键字)并存储在内存中。所以你所有的工作都将通过对象来完成,你只需使用类来告诉它你想要什么类型的对象。

      【讨论】:

      • 等等,DataOnly 也是一个类?
      • DataOnly 和 MethodOnly 都是类。您可以看到这是因为它们的使用方式,也因为它们被定义为代码示例底部的类。它们都定义了可以在内存中构建的不同类型的对象。在您的代码中,创建的对象是 data1 和 method1。更准确地说,对象在内存中,这些变量是指向它们的指针,因此您可以使用代码中的名称访问它们。
      • 哇,你是怎么想到蓝图的? ;)
      • @Tamás Szelei - 不知道。只是看起来合乎逻辑。
      • 我们不创建变量,我们只声明它们;-)。
      【解决方案7】:

      这是一个非常不自然的例子。类的目的是为创建对象提供模板。对象是一组数据,以及对这些数据进行操作的方法。

      是的,data1 是变量。 new DataOnly() 使用 DataOnly 作为模板为对象分配内存(为列出的变量留出空间)。 data1 是对存储对象的位置的引用,因此data1.iMem 指的是作为 data1 引用的对象一部分的字段 iMem。

      至于 MethodOnly ,这是一个具有方法的对象的示例。在此示例中,方法只是您可以调用的函数,但是因为它们被定义为实例方法,您需要先实例化 MethodOnly 类型的对象,然后才能调用该方法。在这种情况下,如果为类声明了实例变量会更有意义——实例方法的想法是对实例的引用被隐式传递给方法,以便您的方法可以访问该对象的实例变量,所以在这里必须创建一个对象来调用该方法似乎是一个奇怪的技术问题,你感到困惑也就不足为奇了。

      基本上,关键字new 后跟类型名称和括号是分配内存,然后将左侧的变量设置为指向该内存位置的指针。

      【讨论】:

        【解决方案8】:

        1) DataOnly data1 = new DataOnly();
        DataOnly 就像一个变量类型。像 String data1 一样思考,但它是您创建的一个类。 data1DataOnly 类型的对象。 new 用于表示创建此类的新实例。 DataOnly() 是构造函数。也就是说,它告诉计算机制作对象。

        2) LIMIT、iMem 和 dMem 是 data1 中的变量。你可以很容易地说 data1.LIMIT = 9000;它只是访问对象 data1 内部的变量。

        3) Method only 是一个使用方法的对象。方法只是函数的另一个名称,但它位于对象内部。标准做法是通过方法而不是直接访问变量来访问和更改对象的变量:

        public class Methods {
          public int getVariable() {
            return variable;
          }
        
          public void setVariable(int i) {
            variable = i;
          }
        
          private int variable;
        }
        

        如果您不知道,private 用于使变量对对象中的方法可见,但对对象之外的方法不可见。在这种情况下,你不能调用System.out.println(data1.variable); 你必须使用方法getVariable

        希望这能解决问题。

        【讨论】:

        • 等等,DataOnly 也是一个类?
        【解决方案9】:

        DataOnly 是对象的类型。

        Data1 是对象。

        new Data() 正在调用对象的构造函数,它基本上在内存中为对象分配一个新位置并运行构造函数中的任何代码。

        【讨论】:

          猜你喜欢
          • 2021-12-29
          • 2015-01-07
          • 2019-04-01
          • 1970-01-01
          • 2010-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多