static关键字的作用是什么

如题所述

第1个回答  推荐于2018-03-14
这是我的C++笔记,看能不能用。
static用法:
1、修饰函数的局部变量:
特点:有默认值0,只执行一次,运行一开始就开辟了内存,内存放在全局
2、修饰全局函数和全局变量:
特点:只能在本源文件使用
3、修饰类里面的成员变量:
特点:和1差不多,定义多个static y,但只有一个y,不进入类的大小计算,不依赖于类对象的存在而存在(可直接调用,要进行外置声明)
4、修饰类的成员函数:
特点:f():括号里无this指针,只能调用他的本类静态函数和他的静态变量,即是用static修饰过的不依赖于类对象的存在而存在(可不进行外置声明,直接调用)本回答被提问者和网友采纳
第2个回答  2014-06-22
Java语言static表示全局或者静态意思用来修饰成员变量和成员方法也形成静态static代码块Java语言没有全局变量概念
被static修饰成员变量和成员方法独立于该类任何对象也说依赖类特定实例被类所有实例共享只要类被加载Java虚拟机能根据类名运行时数据区方法区内定找们因此static对象任何对象创建之前访问无需引用任何对象
用public修饰static成员变量和成员方法本质全局变量和全局方法当声明类对象时生成static变量副本而类所有实例共享同static变量
static变量前有private修饰表示变量类静态代码块或者类其静态成员方法使用(当也非静态成员方法使用)能其类通过类名来直接引用点重要实际上需要搞明白private访问权限限定static表示要实例化使用样容易理解多了static前面加上其访问权限关键字效也此类推
static修饰成员变量和成员方法习惯上称静态变量和静态方法直接通过类名来访问访问语法:
类名.静态方法名(参数列表...)
类名.静态变量名
用static修饰代码块表示静态代码块当Java虚拟机(JVM)加载类时会执行该代码块(用处非常大)

staticJava语言使用有四种:(变量、方法、代码块、内部类)
1、static变量
按照否静态对类成员变量进行分类分两种:种被static修饰变量叫静态变量或类
变量;另种没有被static修饰变量叫实例变量
两者区别:
对于静态变量内存只有拷贝(节省内存)JVM只静态分配次内存加载类过
程完成静态变量内存分配用类名直接访问(方便)当也通过对象来访问(推荐)
对于实例变量没创建实例会实例变量分配次内存实例变量内存有多拷贝互影响(灵活)

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

3、static代码块
static代码块也叫静态代码块类独立于类成员static语句块有多位置随便放任何方法体内JVM加载类时会执行些静态代码块static代码块有多JVM按照们类出现先顺序依次执行们每代码块只会被执行次
例:
// -- Java code example :)

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代码块位置随便放置
static {
Test5.a = 5 ;
System.out.println(a);
}
public void f(){
System.out.println( " hhahhahah " );
}
}

运行结:
3
hhahhahah
1000
4
5

利用静态代码块对些static变量进行赋值再看眼些例子都staticmain方法样JVM运行main方法时候直接调用而用创建实例
4. 静态内部类(Inner Class)
正确理解static应用于内部类时含义必须记住内部类对象默认持有创建封装类对象句柄而假我们说内部类static种说法却成立
static内部类意味着:
(1) 创建static内部类对象我们需要外部类对象
(2) 能从static内部类对象访问外部类对象

存些限制:由于static成员只能位于类外部级别所内部类拥有static数据或static内部类
倘若了创建内部类对象而需要创建外部类对象所有东西都设static了能正常工作同时也必须内部类设static下所示:
//: Parcel10.Java
// Static inner classes
package c07.parcel10;

abstract class Contents {
abstract public int value();
}

interface Destination {
String readLabel();
}

public class Parcel10 {
private static class PContents
extends Contents {
private int i = 11;
public int value() { return i; }
}
protected static class PDestination
implements Destination {
private String label;
private PDestination(String whereTo) {
label = whereTo;
}
public String readLabel() { return label; }
}
public static Destination dest(String s) {
return new PDestination(s);
}
public static Contents cont() {
return new PContents();
}
public static void main(String[] args) {
Contents c = cont();
Destination d = dest("Tanzania");
}
} ///:~

main()我们需要Parcel10对象;相反我们用常规语法来选择static成员便调用句柄返回Contents和Destination方法
通常我们接口里设置任何代码static内部类成接口部分由于类静态所会违反接口规则——static内部类只位于接口命名空间内部:
//: IInterface.java// Static inner classes inside interfaces
interface IInterface {
static class Inner {
int i, j, k;
public Inner() {}
void f() {}
}
} ///:~

建议大家每类里都设置main()其作类测试床使用样做缺点额外代码数量太多若愿此考虑用static内部类容纳自己测试代码下所示:
//: TestBed.java// Putting test code in a static inner class
class TestBed {
TestBed() {}
void f() { System.out.println("f()"); }
public static class Tester {
public static void main(String[] args) {
TestBed t = new TestBed();
t.f();
}
}
} ///:~

样便生成独立、名TestBed$Tester类(运行程序请使用java TestBed$Tester命令)类用于测试需自己终发行版本包含
PS: 静态内部类--代码示例
Java我们经常会使用内部类(inner classes)没有Static内部类instance创建依赖于其元类样关系似乎比较难表达让我们直接看下面代码:
1: public class Outer {
2: int var;
3
4: void outerHoge() {
5: System.out.println("hogehoge");
6: }
7:
8: void outerHote2() {
9:
10: Inner i = new Inner();
11: staticHoge sh = new StaticHoge();
12:
13:
17: // Inner i2 = new this.Inner();
18: }
19:
20:
21: class Inner {
22: void innerHoge() {
23:
26: var = 1;
27: outerHoge();
28: }
29: }
30:
31: static class StaticHoge() {
32: void methodHoge() {
33:
36: // var = 10;
37: // outerHoge();
38: // Inner inner = new Inner();
39: }
40: }
41: }

static内部类使用我们像Package样用:
1: public class Outer2 {
2: public static class StaticHoge1 {
3: //...
4: }
5: public static class StaticHoge2 {
6: //...
7: }
8: }

像下面样使用:
1: Outer2.StaticHoge1 sh1 = new Outer2.StaticHoge1();
2: Outer2.StaticHoge2 sh2 = new Outer2.StaticHoge2();
stmvobrycv参考哈·····
相似回答