繁体   English   中英

我很难理解Java对象和类

[英]I'm having a hard time understanding Java objects and classes

例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;
  }
}

我去了这个网站 ,我读了它,但我仍然感到困惑。

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

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

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

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

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

2)他们是如何打印data1.LIMIT,data1.iMem,Data1.dMem的? 他们是通过查看DataOnly()的位置来打印的吗? DataOnly()引用类DataOnly吗?

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

3)我完全迷失在MethodOnly对象的整个过程中。

对象可以包含数据和执行函数,具体取决于创建它的tempate(类)。 MethodOnly类似乎被定义为仅包含代码而不包含数据。 DataOnly类似乎被定义为仅存储值而不执行任何操作。

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

因为我们在这里谈论非常基本的面向对象的原则,所以我将忽略挑选给出的例子。 以这种方式看待它 - 您有5个基本概念需要理解:

  • 类 - 在(如JohnFx所述)的类中,用于某事的蓝图。 一个类比将是你家的蓝图。 它描述了房屋如何建造,如何加热或冷却,卧室的数量等。

  • 对象 - 当您分配一些内存空间并根据特定的类设置它时,您可以获得对象。 Instance这个词经常用在这个上下文中。 即“一个班级的实例”。 它实际上意味着同样的事情。

    因此,从房子蓝图(Class)我们现在可以建造房屋(Object)。 您可以从单个蓝图(Class)创建许多对象(实例)。 例如,街道中的每个房屋都可以使用相同的蓝色图案创建。 “new MethodOnly()”是一个如何从java中的类创建对象的示例。

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

    此外,您可以将多个变量都指向同一个对象。 即如果你的笔记本中有你的街道地址,你可以写一份副本给别人,这样他们就可以来参加派对。 现在有两个(变量)音符,两个都指向同一个房子。

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

  • 方法 - 方法是类可以做的事情。 例如,代码中的void printFunc( int iA ) {...}是方法的示例。 它做了一些事情。 在我们的家庭比喻中,你可以按门铃提醒你在前门的人。 这是一个方法: void RingDoorBell()

  • 物业 - 最后有物业。 这些外观和气味就像变量一样。 为什么他们被视为不同是因为他们被宣布为“蓝图”类的一部分。 您的DataOnly类是一个包含3个基本变量Properties的示例。

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

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

这个例子中有很多概念。 看一下更简单的一些可能是明智之举。 但我会试着解释一下。

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

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,因为类是“蓝图”,对象是我们使用该蓝图创建的对象。

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

对于你的第二个问题 :如果你理解我之前的解释,那么这个问题应该没问题。 我们想用object做某事 - 打印其成员。 好的,我们有参考。 . (点)用于访问对象的部分。 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

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

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

在这段代码中:

DataOnly data1 = new DataOnly();

第一个DataOnly是类型, data1是特定于对象的名称。 new DataOnly()只是意味着您将data1设置为DataOnly类的新实例。 () ”指定参数,在这种情况下为none,将被发送到构造函数以修改DataOnly的特定实例data1

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

希望这可以帮助。

DataOnly是对象的类型。

Data1是对象。

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

这是一个非常不自然的例子。 类的目的是提供用于创建对象的模板。 对象是与对该数据进行操作的方法打包在一起的一组数据。

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

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

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

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

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

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

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

希望这可以解决问题。

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 =用于实例化类型对象的关键字(instantiation = creation)

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

DataOnly() =在创建时调用的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类更像是一个Utility类,因为它没有自己的任何数据。 它的唯一目的是通过类型为int / string的2种方法获取输入并将其打印出来。

您可能希望查看Java Trails 特别是, 学习Java语言跟踪的开头是对Java中使用的对象和类的体面概述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM