前言
在本专栏之前第二节学了局部变量和成员变量,只是比较说明了局部变量必须赋值,这样才分配了内存,才能访问,而成员变量可以不赋值(Java中默认会给成员变量赋值),也可以赋值。在第4节最后总结中提到,变量前的修饰符的语法为:
修饰符可以省略,也可以是public、protected、private、static、final、abstract。其中(1)public、protected、private三个最多只能出现一个;(2)abstract 和 final 最多只能出现一个;(3)static视需求,可出现也可不出现
参考资料:
1.《疯狂Java讲义》(第3版 李刚)— P123-130
1 static能修饰局部变量吗?
对于(1)、(2)后面类的继承、抽象类及接口相关知识大致会讲到,今天来看看(3)。书中提到,static可以用来修饰成员变量和方法,其中用static修饰的成员变量可称为静态变量或类变量,static修饰的方法可以成为静态方法或类方法
疑点1—static可以修饰局部变量(形参、方法中的局部变量、代码块中的局部变量)吗?
我们现在来试一试
编译报错如下
修改类Animal如下
编译依然报错
由上可知方法(无论是否是static)里的定义的局部变量不可为static
那么方法里的形参呢?
修改Animal类
编译
由此可见方法(无论是否是static)的形参必不能是static
那么代码块中的呢?
由于之前没有接触过代码块,因此先来个对比(先确保可在代码块中定义变量,至于能不能定义static类型的后面再实验),代码如下
编译
上面犯了一些小错误,修改代码
Animal.java
class Animal{
{
int testNum1 = 0;
num1 = 5;
}
private int num1 = 8;
Animal(){
}
void testF1(){
}
int getNum1(){
return num1;
}
}
Main.java
class MainActivity{
public static void main(String[] args){
Animal animal = new Animal();
System.out.println(""+animal.getNum1());
}
}
编译运行结果如下
而如果把代码块和定义num1的语句调换位置,结果如下
通过以上测试说明了代码块中可以定义变量,那么接下来测试能能否定义static类型的变量,代码如下
class Animal{
private int num1 = 8;
{
int testNum1 = 0;
static int testNum2 = 99;
num1 = 5;
}
Animal(){
}
void testF1(){
}
int getNum1(){
return num1;
}
}
编译,结果如下
2 static修饰的成员变量与方法的使用
详细内容参考李刚老师的资料,总之一点,记住static是所有对象都共有的,可以通过类名访问,与类共存亡!(实例变量与对象共存亡)因此通过某一个对象或类名访问修改后,其他对象再访问的就是修改后了的(类名也是同理)。
同时也静态成员变量与方法也可以通过对象来访问(哪怕这个对象为null也可以访问)
2.1 static修饰成员变量
static修饰的成员可以使用对象来访问,也可以直接通过类名来访问,需要注意的是,类中不可用this访问本类中的static成员变量
案例代码
Animal.java
class Animal{
static int num1;
private int num2;
void setNum2(int num){
num2 = num;
}
int getNum2(){
return num2;
}
}
Main.java
class MainActivity{
public static void main(String[] args){
Animal a1 = new Animal();
Animal a2 = new Animal();
System.out.println("Before Changed");
System.out.println("a1.num1 = "+a1.num1);
System.out.println("a1.num2 = "+a1.getNum2());
System.out.println("Animal.num1 = "+Animal.num1);
System.out.println("a2.num1 = "+a2.num1);
System.out.println("a2.num2 = "+a2.getNum2());
System.out.println();
System.out.println();
a1.num1 = -34;
a1.setNum2(67);
System.out.println("After Changed!");
System.out.println("a1.num1 = "+a1.num1);
System.out.println("a1.num2 = "+a1.getNum2());
System.out.println("Animal.num1 = "+Animal.num1);
System.out.println("a2.num1 = "+a2.num1);
System.out.println("a2.num2 = "+a2.getNum2());
}
}
编译运行结果
2.2 static修饰方法
而对于类中static修饰的方法,可以使用对象来访问,也可以直接使用类名来访问,而需要注意的是,static方法不可访问非static的成员,此方法中不可出现this,super
案例
Animal.java
class Animal{
static int num1;
private int num2;
void setNum2(int num){
num2 = num;
}
int getNum2(){
return num2;
}
static void testFun(){
System.out.println("A static function is running !");
}
}
Main.java
class MainActivity{
public static void main(String[] args){
Animal a1 = new Animal();
System.out.println("Using an Object");
a1.testFun();
System.out.println();
System.out.println();
System.out.println();
System.out.println("Using a class");
Animal.testFun();
}
}
编译运行,结果如下
3 总结
(1)局部变量不可用static修饰
(2)static方法中不可访问非static的成员变量,static变量为所有对象共有