首页 > 其他分享 >static关键字

static关键字

时间:2022-09-18 09:23:13浏览次数:78  
标签:变量 Chinese 关键字 实例 static println String

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.代码角度

当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。

课堂上的一个例子

public class SquareInt {

public static void main(String[] args) {
int result;

for (int x = 1; x <= 10; x++) {
result = square(x);
// result=(int)Math.pow(x,2);
System.out.println("The square of " + x + " is " + result + "\n");
}
}

public static int square(int y)
{
return y * y;
}
}
问:为何子方法去掉static后报错

 

原因:一个方法用static修饰,便是静态方法或类方法。静态方法不属于特定对象。

由于static方法在装载class时首先完成,比构造方法早,此时非static属性和方法还没有完成初始化。

所以,在static方法内部无法直接调用非static方法(可以通过先实例化对象,再用该对象调用非static方法),但非static方法中可以调用static方法,通过类.方法名()的方式。

标签:变量,Chinese,关键字,实例,static,println,String
From: https://www.cnblogs.com/mendianyu/p/16704202.html

相关文章