在Java中创建静态对象的目的是什么?

时间:2017-01-12 10:50:23

标签: java

class Demo {
   void show() {
      System.out.println("i am in show method of super class");
   }
}
class Flavor1Demo {

   //  An anonymous class with Demo as base class
   static Demo d = new Demo() {
       void show() {
           super.show();
           System.out.println("i am in Flavor1Demo class");
       }
   };
   public static void main(String[] args){
       d.show();
   }
}

在上面的代码中,我不理解使用前面的静态关键字创建Demo类的对象d的用法。如果我删除了static关键字,则会显示错误。实际上,我正在经历一个匿名的内部阶级概念并被困在这里。需要帮助....有人可以解释一下吗?

5 个答案:

答案 0 :(得分:4)

Java中的static关键字表示变量或函数在该类的所有实例之间共享,而不是实际的对象本身。

在您的情况下,您尝试使用static方法

访问资源
public static void main(String[] args)

因此,我们在不创建类Flavor1Demo的实例的情况下访问的任何内容都必须是static资源。

如果您要从static课程中删除Demo关键字,您的代码应如下所示:

class Flavor1Demo {

// An anonymous class with Demo as base class
Demo d = new Demo() {
    void show() {
        super.show();
        System.out.println("i am in Flavor1Demo class");
    }
};

public static void main(String[] args) {

    Flavor1Demo flavor1Demo =  new Flavor1Demo();
    flavor1Demo.d.show();
}
}

在这里,我们创建了Flavor1Demo的实例,然后获取non-static资源d 上面的代码不会抱怨编译错误。

希望它有所帮助!

答案 1 :(得分:1)

这是因为您尝试在静态方法中使用属于对象的d

然后,您必须在main方法中创建该对象。

static属于class,而不是object本身。

I want to know the difference between static method and non-static method

答案 2 :(得分:1)

这取决于你所处的背景。

main(String[])方法是一种静态方法。

为了保持简单,这意味着它不存在于Flavor1Demo的实例中,此处没有this。如果您将d设置为非静态,则它只会存在于Flavor1Demo的实例中,因此除非您先构建实例,否则无法从main进行访问(new Flavor1Demo().d.show(); $qb = $this->createQueryBuilder('r') ->select('SUM(r.montantHt)') ->where('r.statut <> :nostatut') ->setParameter('nostatut', Restauration::STATUT_CREEE) ->andWhere('r.affectation_jour1 <> :nosaf OR r.affectation_jour1 IS NULL') ->setParameter('nosaf','Pas de table disponible');

但是静态变量将链接到类而不是实例,意味着您可以从静态上下文访问它。在你的情况下,主要方法。

答案 3 :(得分:1)

static删除static Demo d = new Demo()关键字会导致错误,因为您在d方法Demo中使用了main类对象static 1}}。当您从static中删除static Demo d = new Demo()关键字时,您正在使dDemo的对象non-static无法引用non-static对象static上下文。

如果您从d.show();方法移除main并从static移除static Demo d = new Demo()关键字,则不会收到错误消息。

现在,如果您想调用show类的Demo方法,则必须在Demo方法中创建main类的对象。

public static void main(String[] args){
     Demo d = new Demo(); 
     d.show();
 }

答案 4 :(得分:0)

为了在不创建对象的情况下访问主类中的方法或变量,在此定义匿名内部类,在其中创建静态类型的对象,以便直接从主类访问它而无需创建对象。