java中static关键字的意义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中static关键字的意义相关的知识,希望对你有一定的参考价值。

它的意义是什么?我只知道static定义了一个变量,它能在整个程序中使用。请高手们举个简单点的例子,最好形象点。我是菜鸟

上述代码块运行的结果为:

上述代码块运行的结果为:

1. static关键字 : 静态的意思。可以修饰成员变量和成员方法。

2. static关键字的特点

    A : 随着类的加载而加载

    B : 优先于对象存在

    C : 被类的所有对象共享

    这其实也是我们判断该不该使用静态的依据。
    同一个班级的学生应该共用同一个班级编号。
    饮水机 (用静态修饰)
    水杯 (不能用静态修饰)

    D : 可以通过类名调用

    既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。

    3. static关键字的注意事项

    A : 在静态方法中没有this关键字,如何理解呢 ?

    静态是随着类的加载而加载,this是随着对象的创建而存在。

    静态比对象先存在。

    B : 静态只能访问静态。

    静态方法只能访问静态的成员变量。

    静态方法只能访问静态的成员方法。

    非静态方法可以访问静态和非晶态的成员变量。

    非静态方法可以访问静态和非晶态的成员方法。

    4. 静态变量和成员变量的区别

    A : 所属不同

    静态变量:属于类,类变量
    成员变量:属于对象,对象变量,实例变量

    B : 内存位置不同

    静态变量:方法区的静态区
    成员变量:堆内存

    C : 生命周期不同

    静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
    成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失

    D : 调用不同

    静态变量:可以通过对象名调用,也可以通过类名调用
    成员变量:只能通过对象名调用

参考技术A 我给你沾了点 可能你不是全看得懂 明白点算点吧
内存的 划分 你了解不? 像理解透static 建议 你对内存划分 做下了解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。

static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。

static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名

用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。

1、static变量
 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

两者的区别是:
 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
 对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

所以一般在需要实现以下两个功能时使用静态变量:
 在对象之间共享值时
 方便访问变量时

2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,
因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。
因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。

静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的

3、static代码块

 static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,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

 利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。

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修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的
参考技术B 有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static成员的最常见的例子是main( )。因为在程序开始执行时必须调用main(),所以它被声明为static。声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。
声明为static的方法有以下几条限制:
· 它们仅能调用其他的static方法。
· 它们只能访问static数据。
· 它们不能以任何方式引用this或super(关键字super与继承有关,在下一章中描述)。
如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static块仅在该类被加载时执行一次。
下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
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修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的
参考技术C 这个有点像“全局”的概念。

public class MyClass
public static void aStaticMethod() ... ; //静态方法
public void aNonStaticMethod() ... ; //非静态方法
...

当你定义了一个类,如果里面的方法或变量定义为static的,那么该方法或函数对于该类的对象只有一个,因此可以用类名来引用并访问,比如MyClass.aStaticMethod()

而非静态的方法或变量,你是必须创建一个该类的新的对象的,比如上面的非静态方法,就必须用new MyClass().aNonStaticMethod( ).

说起来,这个很好理解的。
举个简单例子,你买了某个品牌的小汽车,你的小汽车对于这个品牌的车子就应该创建个对象,你开车,自己修车都应该是非静态方法。
而街上那些汽车修理店对你这种牌子的车所有来修车的来说是公共的,他们的修车,洗车这些方法应该是静态方法。

另外,还有一些规则,比如静态方法内部不能有非静态方法,而非静态方法内是可以用静态方法的,这就要你多练习来掌握了。
参考技术D static关键字

通常来说,当你创建类时,就是在描述那个类的对象的外观与行为。除非你用new创建那个类的对象,否则,你实际上并未获得任何东西。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。

但是有两种情形,用上述方法是无法解决的。一种情形是,你只想为某特定数据分配一份存储空间,而不去考虑究竟要创建多少对象,还是甚至根本就不创建任何对象。另一种情形是,你希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。通过 Static 关键字,可以满足这两方面的需要。当你声明一个事物是Static时,就意味着这个数据或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其Static方法或访问其Static数据。通常,你必须创建一个对象,并用它来访问数据或方法。因为非Static数据和方法必须知道它们一起运作的特定对象。由于在用Static方法前,不需要创建任何对象;所以对于Static方法,不能只是简单地通过调用其它方法,而没有指定某个对象,来直接访问非Static成员或方法(因为非Static成员或方法必须与某一特定对象关联)。
我刚好看到这,呵呵~~

参考资料:摘自《Thinking in Java 3th Edition》

java中this在这里的用法意义?

toolBar.setLayout(new FlowLayout(FlowLayout.LEFT));
toolBar.add(btnAdd);
toolBar.add(btnResetPwd);
toolBar.add(this.btnDelete);//为什么要用this?上面都木有用阿??

你把this去掉也行的,this代表当前对象。this.btnDelete是调当前对象的btnDelete属性。上面加上也是一样的效果,一般开发人员敲this其实是为了开发方便,因为Eclipse会给你显示当前对象的属性和方法供你调用 参考技术A 这个不得不跟你解释一下.. . . 不知道你用过Eclipse没 . . ..

当我们不记得一个类的成员变量 或者变量名很长的时候 我们可以用this. 来达到自动提示的效果...

以上是关于java中static关键字的意义的主要内容,如果未能解决你的问题,请参考以下文章

干货——详解Java中的关键字

对动态创建的数组使用 static 关键字有啥意义吗?

static关键字的作用?

Java中static关键字解析

Java——static关键字

static关键字