1

类实例(例如由静态/最终声明的变量)和静态方法(例如类方法)之间是否有任何特殊关系?

我希望你明白我的意思。

4

4 回答 4

2

我认为您谈论的是静态变量而不是类实例(没有这个术语),我能想到的静态变量和静态方法之间的一种关联是,在您的静态方法中,您只能访问静态变量而不是实例变量

于 2013-12-19T15:51:29.000 回答
1

静态和非静态方法/类是完全不同的野兽。让我们使用一个面向对象编程的例子。假设我有一个名为“Person”的类,有一个名为 的构造函数Person(),实例变量声明为 myAge(设置为 0),还有一个名为的方法Birthday()

int myAge;

public Person(){
    myAge = 0;
}

public void Birthday(){
    myAge += 1;
}

在我的main方法中,此类将像这样使用:

Person Sajjad = new Person();
Sajjad.Birthday();

当我创建一个新人,也就是你时,你的年龄是 0,因为我们的构造函数的默认值是 0 myAge。一旦我把这个Birthday()方法应用到你身上,你的年龄就会增加一倍。

至于static方法,里面没有面向对象的原则。它是有用途的。我通常用它来做简单的数学运算。

public static double addValues(double a, double b){
    return a + b;
}

在我的main

int sum;
sum = addValues(1, 2);
System.out.println(sum);

输出:

3

看看上面如何不需要声明一个新对象?静态方法更容易原型化,但从长远来看,我肯定会遵循面向对象的原则,因为从长远来看,它使代码维护变得容易得多。此外,我不需要用不必要的代码行来弄乱我的主要方法。

PS如果代码是错误的,那真的只是我编造的一些伪代码。

于 2013-12-19T15:50:39.217 回答
1

Access: class instance (i.e variables that declared by static/final)static方法可以一起工作,而无需明确需要对象引用。而要访问成员变量(又名实例变量),您需要通过对象引用进行访问。

class Test {
    static String str = "asdf";
    int num = 10;

    static void methodA() {
        System.out.println("Static variable direct access: " + str);
        System.out.println("Member variable access : " + new Test().num);
    }
}

并发性: 其他区别是在并发访问或线程安全逻辑期间,class-level-lock可以通过class-variablesin获取static-methods,也可以通过inobject-level-lock获取,尽管您当然可以混合匹配。member-variablesmember-methods

class Test {
    static Object CLASS_LOCK = new Object();
    Object MEMBER_LOCK = new Object();
    Test sharedTest = new Test(); // or created in different manner

    static void methodA() {
        synchronized (CLASS_LOCK) {
            // .. thread-safe code
        }

        synchronized (sharedTest.MEMBER_LOCK) {
            // .. thread-safe code
        }
    }
}
于 2013-12-19T16:00:03.843 回答
1

类实例是存储在内存中并通过类的类型变量引用的对象。每个元素都有自己的状态和自己的方法。例如:如果我们有一个Apple类和一个getColor非静态元素:

Apple a = new Apple("green");
Apple b = new Apple("red");
a.getColor();//green
b.getColor();//red

静态方法/变量是与该类相关的元素,并通过类的名称进行访问。您无法从实例访问静态元素。例如:如果我们有一个Apple类和一个size静态元素:

Apple.tree; //Apple Tree

这是苹果的课堂

class Apple {
    public static String tree = "Apple Tree"; // Class related
    private String color; //object instance related

    public Apple(String color) {
        this.color = color;
    }

    public String getColor() {
        return this.color;
    }
}

因此,拥有此类颜色将取决于实例。

于 2013-12-19T15:54:45.163 回答