2013-08-07 62 views
10

我知道在OOP中,instance = object。因此,如果我们有课是这样的:实例和对象之间的功能区别是什么?

public class something 
{ 
    public static void main(String args[]) 
    { 
    } 
} 

请问此行的主要方法创建新的对象instance

something instance=new something(); 

我的第二个问题是相似的:如果我们创建Thread对象 - Thread t1=new Thread();它实际上意味着我们已经创建Thread类的一个实例,从中我们可以静态调用的方法? (例如sleep())。

+5

+1以简单清晰的方式提出简单问题。你很惊讶这里有多少人以复杂的方式提出简单的问题。 – christopher

+0

我总是非常注意这一点(我家的一半人不是英国人,你有没有试过告诉一大堆阿拉伯人他们错了?这是可怕的东西)。然而,这里有些人是**英语原住民,仍然试图让自己听起来更聪明,或者使问题复杂化,像“XY问题”这样的问题。我想,虽然我看到一个简单问题的好例子,但不妨称赞OP! – christopher

回答

12

如果我们创建了Thread对象 - Thread t1 = new Thread();这是否意味着我们已经创建了Thread类的实例,从中我们可以静态调用方法? (例如sleep())。

当您调用静态方法时,不会从对象调用它。这就是为什么它是静态的。实例不需要执行静态方法。

Thread t1 = new Thread(); 
t1.checkAccess(); // <--- This is an instance method. 

Thread.activeCount(); // <-- This is a static method. 

当看到new关键字,这意味着正在创建一个新对象。在这种情况下,正如你所说的那样,它是Thread类的一个实例。

你如何区分他们?

嗯,很简单。如果是实例方法,则将从对象的上下文中调用它。

String str = new String("hello"); 
str = str.replaceAll("o", ""); 

正如你所看到的,你必须创建一个实例使用一个实例方法

静态方法,它更容易。他们将被称为除了班级的名字。

String.copyValueOf(new char[] {'a', 'b', 'c'}); 

有没有必要创建一个新的String实例。只需使用班级的名字。

:正如在评论中指出,一个静态方法可以从一个实例对象调用,但这不是普遍的做法。如果你不确定,文档是你最好的朋友。或者您可以简单地通过尝试从静态上下文中调用相同的方法来进行测试。

何时使用静态方法而不是实例方法?

嗯,这是回答,非常好,在这里:Java: when to use static methods,我看没有任何意义的重复吧:)

+1

可能值得注意的是,虽然您不需要实例来执行静态方法,但您可以执行此操作。这不是一个语法错误,写t1.activeCount() – Mike

+1

不是,但我敢肯定,大多数IDE会抱怨你从一个实例对象调用静态方法,所以大多数时候静态方法会应该(或至少应该)从班级的背景中调用。 – christopher

+0

你是对的,IDE通常会发出警告。我只是认为这会给你的答案带来很好的补充,因为它是新程序员的混乱语言特性。 – Mike

2

的对象是在这两种情况下创造了你举:

something instance=new something(); 
Thread t1=new Thread(); 

然而,第二种情况,虽然创建了一个Thread对象,但是一个线程在启动之前不会启动。

这实际上是否意味着我们已经创建了类Thread的实例,从中我们可以静态调用方法? (例如sleep())。

你不需要一个对象来调用静态方法。静态方法适用于整个类,而不是特定的实例。你可以调用Thread.sleep()方法是这样的:

Thread.sleep(500); 
1

你的第一个问题,是的,这将在变量instance创建something一个实例(不是一个伟大的变量名,顺便说一句)。

对于第二个问题,是的,该代码将创建一个Thread实例。但是,您不会使用静态方法(如t1.sleep())。用类名调用静态方法,例如Thread.sleep。您不必为这些创建实例。

0

实例不过是一个动态内存分配。在java'new'操作符中的某处用于创建一个实例,但object是类的成员的动态内存分配,或者您可以说object是该类的实例。例如malloc(),calloc()是动态内存分配函数,所以我们可以说他们正在创建实例,但我们不能说他们正在创建对象。

相关问题