类实例(例如static / final声明的变量)和静态方法(例如类方法)之间是否存在任何特定关系?
我跳你明白我的意思。
答案 0 :(得分:2)
我认为你所谈论的是静态变量而不是类实例(没有这个术语),静态变量和静态方法之间的一个关联我能想到的是,在静态方法中,您只能访问静态变量而不是实例变量。
答案 1 :(得分: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,因为myAge
的构造函数的默认值为0。一旦我对您应用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
看看上面怎么没有必要声明一个新对象?静态方法更容易原型化,但从长远来看,我肯定采用面向对象的原则,因为它使得长期维护代码变得更加容易。另外,我不需要用不必要的代码行来混淆我的主要方法。
P.S。如果代码错了,那真的只是我编写的一些伪代码。
答案 2 :(得分: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
这是Apple类
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;
}
}
因此,拥有此类颜色将取决于实例。
答案 3 :(得分:1)
使用:强>
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-variables
中的static-methods
进行,object-level-lock
可以通过member-variables
进行member-methods
1}}虽然你可以混合使用场合。
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
}
}
}