java中static关键字的意义
作用:static可以修饰变量、方法、代码块和内部类
static属性属于这个类所有,即由该类创建的所有对象共享同一个static属性。可以对象创建后通过对象名.属性名和类名.属性名两种方式来访问。也可以在没有创建任何对象之前通过类名.属性名的方式来访问。
static变量和非static变量的区别(都是成员变量,不是局部变量)1.在内存中份数不同
不管有多少个对象,static变量只有1份。对于每个对象,实例变量都会有单独的一份
static变量是属于整个类的,也称为类变量。而非静态变量是属于对象的,也称为实例变量
2.在内存中存放的位置不同
3.访问的方式不同
实例变量: 对象名.变量名 stu1.name="小明明";
静态变量:对象名.变量名 stu1.schoolName="西二旗小学"; 不推荐如此使用
类名.变量名 Student.schoolName="东三旗小学"; 推荐使用
4.在内存中分配空间的时间不同
Student.schoolName="东三旗小学";或者Student stu1 = new Student("小明","男",20,98);
static方法也可以通过对象名.方法名和类名.方法名两种方式来访问
static代码块。当类被第一次使用时(可能是调用static属性和方法,或者创建其对象)执行静态代码块,且只被执行一次,主要作用是实现static属性的初始化。
static内部类:属于整个外部类,而不是属于外部类的每个对象。不能访问外部类的非静态成员(变量或者方法),.可以访问外部类的静态成员
在《Java编程思想》P86页有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:
方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
上述代码块运行的结果为:
上述代码块运行的结果为:
1. static关键字 : 静态的意思。可以修饰成员变量和成员方法。
2. static关键字的特点
A : 随着类的加载而加载
B : 优先于对象存在
C : 被类的所有对象共享
这其实也是我们判断该不该使用静态的依据。
同一个班级的学生应该共用同一个班级编号。
饮水机 (用静态修饰)
水杯 (不能用静态修饰)D : 可以通过类名调用
既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
A : 在静态方法中没有this关键字,如何理解呢 ?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
B : 静态只能访问静态。
静态方法只能访问静态的成员变量。
静态方法只能访问静态的成员方法。
非静态方法可以访问静态和非晶态的成员变量。
非静态方法可以访问静态和非晶态的成员方法。
A : 所属不同
静态变量:属于类,类变量
成员变量:属于对象,对象变量,实例变量B : 内存位置不同
静态变量:方法区的静态区
成员变量:堆内存C : 生命周期不同
静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失D : 调用不同
静态变量:可以通过对象名调用,也可以通过类名调用
成员变量:只能通过对象名调用
3. static关键字的注意事项
4. 静态变量和成员变量的区别
我给你沾了点 可能你不是全看得懂 明白点算点吧
内存的 划分 你了解不? 像理解透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修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的
有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字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修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的
这个有点像“全局”的概念。
public class MyClass{
public static void aStaticMethod() { ... }; //静态方法
public void aNonStaticMethod() { ... } ; //非静态方法
...
}
当你定义了一个类,如果里面的方法或变量定义为static的,那么该方法或函数对于该类的对象只有一个,因此可以用类名来引用并访问,比如MyClass.aStaticMethod()
而非静态的方法或变量,你是必须创建一个该类的新的对象的,比如上面的非静态方法,就必须用new MyClass().aNonStaticMethod( ).
说起来,这个很好理解的。
举个简单例子,你买了某个品牌的小汽车,你的小汽车对于这个品牌的车子就应该创建个对象,你开车,自己修车都应该是非静态方法。
而街上那些汽车修理店对你这种牌子的车所有来修车的来说是公共的,他们的修车,洗车这些方法应该是静态方法。
另外,还有一些规则,比如静态方法内部不能有非静态方法,而非静态方法内是可以用静态方法的,这就要你多练习来掌握了。
static关键字
通常来说,当你创建类时,就是在描述那个类的对象的外观与行为。除非你用new创建那个类的对象,否则,你实际上并未获得任何东西。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
但是有两种情形,用上述方法是无法解决的。一种情形是,你只想为某特定数据分配一份存储空间,而不去考虑究竟要创建多少对象,还是甚至根本就不创建任何对象。另一种情形是,你希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。通过 Static 关键字,可以满足这两方面的需要。当你声明一个事物是Static时,就意味着这个数据或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其Static方法或访问其Static数据。通常,你必须创建一个对象,并用它来访问数据或方法。因为非Static数据和方法必须知道它们一起运作的特定对象。由于在用Static方法前,不需要创建任何对象;所以对于Static方法,不能只是简单地通过调用其它方法,而没有指定某个对象,来直接访问非Static成员或方法(因为非Static成员或方法必须与某一特定对象关联)。
我刚好看到这,呵呵~~
意大利语高手帮帮忙,会追加100分!!
Durante il periodo degli stati belligeranti, ci fu un contadino del paese Song che lavorava duramente nei campi tutti i giorni in modo che potesse sostenere la sua famiglia.有一天,那个农夫又像往常一样到田里工作的时候,看到一只跑得非常急的兔子,从草丛中窜出来时,竟然不小心一头撞...
求这篇意大利语的中文翻译!!!
che individuava negli ebrei una sorta di"nemico interno" del popolo.反犹太主义既认为犹太人是人民的某种《内敌》。Piu in generale, i vari nazionalismi europei portavano gli Stati a scontrarsi l'uno con l'altro:通常,欧洲不同的民族主义会使一个国家与另一个国家互相冲突。da qui ...
为什么二战期间日本要侵略中国 美网友热议
在远东地区,二战刚刚开始(当时仅西欧开战,二战并未正式开始):准确地说(不算1931年所谓的奉天事变【注:九一八事变别称】和日本对满洲的侵略),1937年7月7日,在靠近天津地区的马可波罗桥【注:即卢沟桥,在《马可·波罗游记》中它被形容为一座巨丽的石桥,后来外国人都称它为“马可波罗桥”。】,...
急!!!意大利语作文《我的大学》
Così, con un grande sorriso sul mio volto, ho detto a mio padre "non importa, papà. In questo tipo di condizione, voglio farmi meglio! "Mio padre si sentiva meglio. Ma quando tornava, vedendo la sua schiena, ho solo voglia di piangere! Io vivo in questa città ero solo isolato,...
濯底致平: static表示的静态,可以直接通过”百类名.方法“或者是”类名.变量“的形式调用.解释:static在java中表示的是静态,也就是项目在初始化运行的时候就会把静态的方法、变量加载到内存度中,方便参数回的获取和方法的调用.备注:静态变量必须在初始化之前进行赋值,否则会报错.静态方法答通常都是被经常使用的方法,不需要每次都重新实例化,提高工作效率.
休宁县13428272841: JAVA中static 关键字代表什么意思 - ?
濯底致平: 在《Java编程思想》P86页有这样一段话:“static方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途.”这段话虽...
休宁县13428272841: java中static的作用 - ?
濯底致平: static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念.被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要.实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了.static前面加上其它访问权限关键字的效果也以此类推.
休宁县13428272841: 在java语言中,关键字static如何具体解释??
濯底致平: static是静态修辞符号.用它来修辞成员变量被视为类的成员变量,而不能当成实例变量,也就是说,静态变量是类固有的,可以被直接引用,而其他成员变量申明后,只有生成对象后才可以引用!
休宁县13428272841: 谁能告诉我static在java中的解释和具体的用法? - ?
濯底致平: static就是声明的静态变量,下面是VB中的静态变量解释,他和JAVA中的是一样的:1. 静态局部变量 在局部变量的说明前再加上static说明符就构成静态局部变量. 例如: static int a,b; static float array[5]={1,2,3,4,5}; 静态局部变量属于静...
休宁县13428272841: JAVA! static什么作用? - ?
濯底致平: 是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,...
休宁县13428272841: java static关键字有什么作用??
濯底致平: static 是静态方法的声明关键字例如 public static void main(String args()){} 这里的main方法 (程序的入口)就是静态的方法 . [duice为您解答]
休宁县13428272841: JAVA Static 的作用 - ?
濯底致平: 作用 有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象.通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例.在成员的声明前面加上关键字static(静...
休宁县13428272841: java static作用是什么? - ?
濯底致平: 可修饰方法和属性,表示静态的意思,被修饰的属性和方法随着类的加载而加载,而没有被static修饰的类和方法是等到使用的时候才加载的.
休宁县13428272841: java中static怎么理解??
濯底致平: Static关键字 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份. 用static声明的方法是静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员 ##静态方法不再是针对于某个对象调用,所以不能访问非静态成员 可以通过对象引用或类名(不需要实例化)访问静态成员 如果某些成员函数只访问静态数据成员,那么最好把他们声明为静态的成员函数,因为这样不需要特定的对象就可以访问这些成员变量了.