>  기사  >  Java  >  Java에서 정적 변수의 역할과 사용법에 대한 자세한 설명

Java에서 정적 변수의 역할과 사용법에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2016-11-26 09:13:532046검색

static은 "전역" 또는 "정적"을 의미하며 멤버 변수 및 멤버 메서드를 수정하는 데 사용됩니다. 정적 코드 블록을 구성할 수도 있지만 Java 언어에는 전역 변수라는 개념이 없습니다.

static으로 수정된 멤버 변수와 멤버 메서드는 클래스의 모든 개체와 독립적입니다. 즉, 클래스의 특정 인스턴스에 의존하지 않고 클래스의 모든 인스턴스에서 공유됩니다.

이 클래스가 로드되어 있는 한, Java Virtual Machine은 기본적으로 클래스 이름을 기준으로 런타임 데이터 영역의 메소드 영역에서 해당 클래스를 찾을 수 있습니다. 따라서 정적 개체는 해당 개체가 생성되기 전에 개체를 참조하지 않고 액세스할 수 있습니다.

public으로 수정된 정적 멤버 변수와 멤버 메서드는 본질적으로 전역 변수이자 전역 메서드입니다. 해당 클래스의 객체가 선언되면 정적 변수의 복사본이 생성되지 않지만 클래스의 모든 인스턴스는 해당 클래스를 공유합니다. 동일한 정적 변수.

정적 변수 앞에는 private 수정이 있을 수 있습니다. 이는 이 변수가 클래스의 정적 코드 블록이나 클래스의 다른 정적 멤버 메서드에서 사용될 수 있음을 나타냅니다(물론 비 메서드에서도 사용할 수 있음). -정적 멤버 메소드 - 넌센스), 하지만 다른 클래스에서 클래스 이름을 통해 직접 참조하지 않는 것이 중요합니다. 실제로 프라이빗은 액세스 권한 제한을 의미하고 정적은 인스턴스화 없이 사용할 수 있다는 것을 의미하므로 이해하기가 훨씬 쉽습니다. static 앞에 다른 액세스 권한 키워드를 추가하는 효과도 동일합니다.

정적 수정 멤버 변수와 멤버 메서드는 일반적으로 클래스 이름을 통해 직접 액세스할 수 있습니다.

정적 메서드 이름입니다. (매개변수 목록...)

클래스 이름. 정적 변수 이름

static으로 수정된 코드 블록은 JVM(Java Virtual Machine)이 클래스를 로드할 때 정적 코드 블록을 나타냅니다. 코드 블록이 실행됩니다(매우 유용합니다, 하하).

1. 정적 변수

클래스 멤버 변수는 정적인지에 따라 두 가지 유형으로 분류할 수 있습니다. 하나는 정적 변수 또는 클래스 변수라고 하는 정적 변수입니다. static으로 수정되지 않는 변수를 인스턴스 변수라고 합니다.

둘의 차이점은 다음과 같습니다.

정적 변수의 경우 메모리에 복사본이 하나만 있습니다(메모리 절약을 위해). JVM은 정적에 대해 한 번만 메모리를 할당하고 정적을 완료합니다. 메모리 할당은 클래스 이름으로 직접 접근할 수 있어 편리합니다. 물론 객체를 통해서도 접근할 수 있습니다(권장하지는 않습니다).

인스턴스 변수의 경우 인스턴스가 생성되기 전에 인스턴스 변수에 대해 메모리가 한 번 할당됩니다. 인스턴스 변수는 서로 영향을 주지 않고 메모리에 여러 복사본을 가질 수 있습니다(유연함).

따라서 정적 변수는 일반적으로 다음 두 가지 기능을 구현해야 할 때 사용됩니다.

객체 간에 값을 공유할 때

변수에 접근하기 편리한 경우

 2 , 정적 메서드

정적 메서드는 클래스 이름을 통해 직접 호출할 수 있으며, 모든 인스턴스도 호출할 수 있습니다.

따라서 this 및 super 키워드를 사용할 수 없습니다. 정적 메서드에서는 소속 클래스에 직접 접근할 수 없으며, 인스턴스 변수와 인스턴스 메서드(즉, static이 없는 멤버 변수와 멤버 메서드)는 자신이 속한 클래스의 정적 멤버 변수와 멤버 메서드에만 접근할 수 있습니다.

인스턴스 멤버는 특정 개체와 연관되어 있기 때문이죠! 이것은 암기하는 것이 아니라 이해하고 이해하는 것이 필요합니다! ! !

정적 메서드는 인스턴스와 독립적이므로 정적 메서드를 구현해야 하며 추상화할 수 없습니다.

예를 들어, 메소드 호출을 용이하게 하기 위해 Java API의 Math 클래스에 있는 모든 메소드는 정적이며, 일반 클래스 내의 정적 메소드도 다른 클래스에서 이 메소드를 호출하는 데 편리합니다.

정적 메서드는 클래스 내부의 특수한 유형의 메서드입니다. 해당 메서드는 필요할 때만 정적으로 선언됩니다. 클래스 내부의 메서드는 일반적으로 비정적입니다.

3. 정적 코드 블록

정적 코드 블록은 클래스 멤버와 독립적인 클래스의 정적 문 블록으로, 여러 개가 있을 수 있으며 JVM 로드에는 없습니다. 클래스 이러한 정적 코드 블록이 여러 개 있으면 JVM은 클래스에 나타나는 순서대로 이를 실행합니다. 각 코드 블록은 한 번만 실행됩니다. 예:

public class Test5 {   
private static int a;   
private int b;   
 
static{   
Test5.a=3;   
System.out.println(a);   
Test5 t=new Test5();   
t.f();   
t.b=1000;   
System.out.println(t.b);   
}   
static{   
Test5.a=4;   
System.out.println(a);   
}   
public static void main(String[] args) {   
// TODO 自动生成方法存根   
}   
static{   
Test5.a=5;   
System.out.println(a);   
}   
public void f(){   
System.out.println("hhahhahah");   
}   
}

실행 결과:

3
hhahhahah
1000
4
5

정적 코드 블록을 사용하면 일부 정적 변수에 값을 할당할 수 있습니다. 모두 정적 기본 메소드를 갖고 있으므로 JVM은 기본 메소드를 실행할 때 인스턴스를 생성하지 않고 이를 직접 호출할 수 있습니다.

  4、static和final一块用表示什么

  static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!

  对于变量,表示一旦给值就不可修改,并且通过类名可以访问。

  对于方法,表示不可覆盖,并且可以通过类名直接访问。

  有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。

  声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:

它们仅能调用其他的static 方法。

它们只能访问static数据。

它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。

  如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:

// Demonstrate static variables,methods,and blocks.   
 
class UseStatic {   
static int a = 3;   
static int b;   
 
static void meth(int x) {   
System.out.println("x = " + x);   
System.out.println("a = " + a);   
System.out.println("b = " + b);   
}   
 
static {   
System.out.println("Static block initialized.");   
b = a * 4;   
}   
 
public static void main(String args[]) {   
meth(42);   
}   
}

一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。

  注意:在一个static 方法中引用任何实例变量都是非法的。

  下面是该程序的输出:

Static block initialized.
x = 42
a = 3
b = 12

在定义它们的类的外面,static 方法和变量能独立于任何对象而被使用。这样,你只要在类的名字后面加点号运算符即可。例如,如果你希望从类外面调用一个static方法,你可以使用下面通用的格式:

classname.method( )

这里,classname 是类的名字,在该类中定义static方法。可以看到,这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。

  下面是一个例子。在main() 中,static方法callme() 和static 变量b在它们的类之外被访问。

class StaticDemo {   
static int a = 42;   
static int b = 99;   
static void callme() {   
 
System.out.println("a = " + a);   
}   
}   
 
class StaticByName {   
 
public static void main(String args[]) {   
StaticDemo.callme();   
System.out.println("b = " + StaticDemo.b);   
}   
}

下面是该程序的输出:

a = 42
b = 99

static成员是不能被其所在class创建的实例访问的。

如果不加static修饰的成员是对象成员,也就是归每个对象所有的。

加static修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的。


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.