我很难理解Java对象和类

时间:2010-10-08 01:37:00

标签: java class object

示例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对象的整个过程中。

9 个答案:

答案 0 :(得分:5)

  

1)DataOnly data1 = new DataOnly();一世   知道这条线创造了一个对象。但   有人可以打破这条线   我?每个单词的作用是什么?的dataonly   是班级?类型? Data1是   变量?我认为新的DataOnly是一个   引用某个位置。而()是   位置的变量?我   正确的吗?

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

  

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

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

  

3)我完全失去了   MethodOnly的整个过程   对象

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

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

答案 1 :(得分:4)

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

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

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

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

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

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

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

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

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

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

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

答案 2 :(得分:2)

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

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

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 intfinal很棘手,在不同的背景下可能意味着不同的东西。这一次意味着变量只能在程序中设置一次,以后不能更改。那么现在怎么办?编译器选择哪个printFunc?没有final int版本。正如我之前所说,编译器试图找到最好的一个,在这种情况下,一个简单的int参数就足够了。如果找不到足够好的匹配,它将停止并打印错误消息。

答案 3 :(得分:1)

在此代码中:

DataOnly data1 = new DataOnly();

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

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

希望这有帮助。

答案 4 :(得分:1)

DataOnly是对象的类型。

Data1是对象。

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

答案 5 :(得分:1)

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

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

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

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

答案 6 :(得分:1)

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

2)LIMIT,iMem,&amp; 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

希望这可以解决问题。

答案 7 :(得分:1)

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 <{1}}

的变量 用于实例化类型对象的

DataOnly关键字(instantiation = creation)

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

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

DataOnly

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

因此,当您在代码中执行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视为对象的基本内存地址,然后执行.LIMIT将使用适当的值抵消它以获取为LIMIT变量保留的空间对象

同样适用于iMem和dMem。

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

data1.LIMIT

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

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

在上述语句之后,MethodOnly method1 = new MethodOnly(); 是MethodOnly类型的对象。

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

答案 8 :(得分:0)

您可能希望查看Java Trails。特别是,Learning the Java Language跟踪以对Java中使用的对象和类的良好概述开始。