暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

静态变量

哈特费尔德的思考 2021-08-30
526

1.变量根据声明的位置进行划分:

在方法体当中声明的变量叫做:局部变量。
在方法体外声明的变量叫做:成员变量。
成员变量又可以分为:实例变量、静态变量

 

2.静态变量的声明的语法格式

语法格式:static 数据类型 变量名
                 static 类名 变量名 = new 类名


3.静态变量的访问

建议使用“类名.”来访问,但使用“引用.”也行(不建议使用"引用.")。静态的如果使用“引用.”来访问会让程序员产生困惑:程序员以为是实例的。没有空指针异常的发生。


4.需要声明静态变量的情形

如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。
一个对象一份的是实例变量。
所有对象一份的是静态变量。
/*
static:
1、static翻译为“静态”
2、所有static关键字修饰的都是类相关的,类级别的。
3、所有static修饰的,都是采用“类名.”的方式访问。
4、static修饰的变量:静态变量
5、static修饰的方法:静态方法

变量的分类:
变量根据声明的位置进行划分:
在方法体当中声明的变量叫做:局部变量。
在方法体外声明的变量叫做:成员变量。

成员变量又可以分为:
实例变量
静态变量
*/


class VarTest{


// 以下实例的,都是对象相关的,访问时采用“引用.”的方式访问。需要先new对象。
// 实例相关的,必须先有对象,才能访问,可能会出现空指针异常。
// 成员变量中的实例变量
int i;


// 实例方法
public void m2(){
// 局部变量
int x = 200;
}




// 以下静态的,都是类相关的,访问时采用“类名.”的方式访问。不需要new对象。
// 不需要对象的参与即可访问。没有空指针异常的发生。
// 成员变量中的静态变量
static int k;


// 静态方法
public static void m1(){
// 局部变量
int m = 100;
}

}
/*
实例的:一定需要使用“引用.”来访问。


静态的:
建议使用“类名.”来访问,但使用“引用.”也行(不建议使用"引用.")。
静态的如果使用“引用.”来访问会让程序员产生困惑:程序员以为是实例的呢。

结论:
空指针异常只有在什么情况下才会发生呢?
只有在“空引用”访问“实例”相关的,都会出现空指针异常。
*/
public class StaticTest03{
public static void main(String[] args){
// 通过"类名."的方式访问静态变量
System.out.println(Chinese.country);
// 创建对象
Chinese c1 = new Chinese("1111111", "张三");
System.out.println(c1.idCard); // 1111111
System.out.println(c1.name); // 张三
System.out.println(c1.country); // 中国


// c1是空引用
c1 = null;
// 分析这里会不会出现空指针异常?
// 不会出现空指针异常。
// 因为静态变量不需要对象的存在。
// 实际上以下的代码在运行的时候,还是:System.out.println(Chinese.country);
System.out.println(c1.country);


// 这个会出现空指针异常,因为name是实例变量。
//System.out.println(c1.name);
}
}


class Chinese{


// 实例变量
String idCard;
String name;


// 静态变量
static String country = "中国";


//构造方法
public Chinese(String x, String y){
idCard = x;
name = y;
}
}
public class StaticTest04{
public static void main(String[] args){


// 这是比较正规的方式,静态方法采用“类名.”
StaticTest04.doSome();


//对象
StaticTest04 st = new StaticTest04();
// 用“引用.”访问
st.doSome();


// 空引用
st = null;
// 不会出现空指针异常
st.doSome(); // 这个代码在最终执行的时候还是会转变为:StaticTest04.doSome();


// 实例方法doOther()
// 对象级别的方法(先new对象,通过“引用.”来访问)
//错误: 无法从静态上下文中引用非静态 方法 doOther()
//StaticTest04.doOther();


StaticTest04 st2 = new StaticTest04();
st2.doOther();


// 空引用
st2 = null;
// 空引用调用实例方法会出现什么问题?空指针异常。
//st2.doOther();


}


// 静态方法(静态方法不需要new对象,直接使用“类名.”来访问)
// 但是也可以使用“引用.”来访问,不建议用。(因为其他程序员会感到困惑。)
public static void doSome(){
System.out.println("静态方法doSome()执行了!");
}


// 实例方法(实例相关的都需要new对象,使用"引用."来访问。)
public void doOther(){
System.out.println("实例方法doOther执行了!");
}
}


// 从第一天开始讲解HelloWorld到目前为止,一个类当中一共就写过这些东西。
/*
类{
// 实例相关的都是需要new对象的,通过"引用."访问。
实例变量;
实例方法;


// 静态相关的都是采用“类名.”访问。也可以使用“引用.”,只不过不建议。
静态变量;
静态方法;
}
*/


文章转载自哈特费尔德的思考,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论