概述
1.static
- static翻译为“静态”
- 所有static关键字修饰的都是
类相关的
,类级别
的。 - 所有static修饰的,都是采用“
类名.
”的方式访问。 - static修饰的变量:
静态变量
- static修饰的方法:
静态方法
2.变量的分类:
变量根据声明的位置
进行划分:
- 在方法体中声明的变量叫做:
局部变量
。 - 在方法体外声明的变量叫做:
成员变量
。
其中成员变量
又可以分为:
- 实例变量
- 静态变量
eg1.
以下实例的,都是对象相关的,访问时采用 “引用.
” 的方式访问。需要先new对象。
实例相关的,必须先有对象,才能访问,可能
会出现空指针异常。
class Test{
// 成员变量中的实例变量
int i;
// 实例方法
public void m2(){
// 局部变量
int x = 200;
}
}
eg2.
以下静态的,都是类相关的,访问时采用 “类名.
” 的方式访问。不需要new对象。
不需要对象的参与即可访问。没有
空指针异常的发生。
class Test{
// 成员变量中的静态变量
static int k;
// 静态方法
public static void m1(){
// 局部变量
int m = 100;
}
}
3.什么时候变量声明为实例的,什么时候声明为静态的?
如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。
建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。
- 一个对象一份的是实例变量。
- 所有对象一份的是静态变量。
eg.
class Chinese{
// 身份证号
// 每一个人的身份证号不同,所以身份证号应该是实例变量,一个对象一份。
String idCard;
// 姓名
// 姓名也是一个人一个姓名,姓名也应该是实例变量。
String name;
// 国籍
String country;
// 无参数
public Chinese(){
}
// 有参数
public Chinese(String s1,String s2, String s3){
idCard = s1;
name = s2;
country = s3;
}
}
class Chinese{
// 身份证号
// 每一个人的身份证号不同,所以身份证号应该是实例变量,一个对象一份。
String idCard;
// 姓名
// 姓名也是一个人一个姓名,姓名也应该是实例变量。
String name;
// 国籍
// 重点重点五颗星:加static的变量叫做静态变量
static String country = "中国";
// 无参数
public Chinese(){
}
// 有参数
public Chinese(String s1,String s2){
idCard = s1;
name = s2;
}
}
注意:
- 静态变量在
类加载时初始化
,不需要new对象,静态变量的空间就开出来了。 - 静态变量存储在
方法区
。
4.重点
eg.
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;
}
}
实例的:一定需要使用“引用.
”来访问。
Chinese c1 = new Chinese("1111111", "张三");
System.out.println(c1.idCard); // 1111111
System.out.println(c1.name); // 张三
System.out.println(c1.country); // 中国
静态的:
建议使用“类名.
”来访问,但使用“引用.”也行(不建议使用"引用.")。
静态的如果使用“引用.”来访问会让程序员产生困惑:程序员以为是实例的呢。
// 通过"类名."的方式访问静态变量
System.out.println(Chinese.country);
System.out.println(c1.country)//这样也行
注意:
c1 = null;
System.out.println(c1.country);
这里不会出现空指针异常。因为静态变量不需要对象
的存在。
实际上以下的代码在运行的时候,还是:
System.out.println(Chinese.country);
结论:
空指针异常只有在只有在“空引用”访问“实例”相关
的,都会出现空指针异常。
5.关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法?
1.思想角度:
如果说该行为必须由对象去触发
。那么该方法定义为实例方法。
2.代码角度
当这个方法体当中,直接访问了实例变量
,这个方法一定是实例方法。
我们以后开发中,大部分情况下,如果是工具类的话,工具类当中的方法
一般都是静态的。(静态方法有一个优点,是不需要new对象,直接采用类名
调用,极其方便。工具类就是为了方便,所以工具类中的方法一般都是static的。)
最后
以上就是大胆花生为你收集整理的Java static关键字(超详细!)1.static2.变量的分类:3.什么时候变量声明为实例的,什么时候声明为静态的?4.重点5.关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法?的全部内容,希望文章能够帮你解决Java static关键字(超详细!)1.static2.变量的分类:3.什么时候变量声明为实例的,什么时候声明为静态的?4.重点5.关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复