1 目录及资源索引
2 静态成员变量
2.1 普通成员变量
普通成员变量,生成的对象是不同的,在内存中也是不同的存在,见如下示例代码:
Person p1 = new Person(); // 生成 对象p1
p1.i = 10;
Person p2 = new Person(); // 生成 对象p2
p2.i = 20;
则上述两个变量 i 在内存中的位置应该是不同的,参考老师课件图片应该如下所示:
2.2 静态成员变量
而对于静态成员变量来说,是可以直接通过 类名.变量名方式赋值,不需要创建对象;可以但不是必须要这样做。
静态成员变量,使用的 i 是同一个。不论有多少个成员变量,使用的都是同一个变量。代码示例如下:
Person p1 = new Person();
Person p2 = new Person();
Person.i = 10;
在内存中的值如下,可以看到所有的静态变量使用的值,都是同一份。
2.3 代码测试
通过一段代码来进行测试,首先声明一个 Person 类,内容如下:
class Person
{
static int i; // 静态成员变量
}
另外写一个类,用来写出主函数,具体代码如下:
class Test
{
public static void main(String args[])
{
Person p1 = new Person();
Person p2 = new Person();
Person.i = 10; // 静态成员变量可以直接这样赋值
System.out.println("p1的i的值为" + p1.i);
System.out.println("p2的i的值为" + p2.i);
p1.i = 20; // 静态成员变量可以直接这样赋值
System.out.println("p1的i的值为" + p1.i);
System.out.println("p2的i的值为" + p2.i);
}
}
实际测试可以看到,两个 i 的值是一样的,且其中有一个修改了此静态变量的值,也会对另外一个造成影响。
静态成员变量,不是属于某一个对象的,而是属于这个类的。
3 静态函数
静态函数:在函数前,加上一个 static 。
静态变量可以用类名调用,静态函数也可以用类名来调用。
静态函数中,不能直接使用非静态的成员变量。
代码示例如下:
class Person
{
String name;
static void talk()
{
System.out.println("My name is " + name);
}
}
由上述代码可以看到,变量不是静态成员变量,编译结果如下:
为什么这样做不可以呢?老师用了反证法,假设是可以的,里边应该是 this.name,如果可以,这个this 是怎么解释的?直接使用类名调用此函数,没有所谓的对象,所以此处 this 就没办法指向对应的对象。
对静态函数做个小结:
- 前边需要加上 static
- 可以直接使用类名调用;
- 在静态函数中,不能使用非静态的成员变量。
4 静态代码块
先写上一段测试代码如下:
class Person
{
static{
System.out.println("静态代码块");
}
static String name;
static void talk(){
System.out.println("My name is " + name);
}
}
参考老师程序代码,可以直接编译执行 Person 类,但是我在编译的时候报错了,如下:
就又添加了一个 Test 类,写了一个主函数,里边只是调用 Person 类,其他什么都不做,代码如下:
class Test
{
public static void main(String args[])
{
Person p1 = new Person();
}
}
然后再次编译,运行结果如下:
可以看到静态代码块里边的内容,自己打印出来了。
静态代码块在什么时候执行,在 装载这个类的 时候就执行了。
静态代码块的主要作用:为一些静态变量赋初始值。
本节课老师总结内容如下:
- 静态成员变量 只有一份;
- 在静态函数中,不能使用 this,所以在静态函数中不能直接只用非静态变量。
- 静态代码块的主要作用是为静态成员变量赋初始值。
5 总结
- 结合原来所学知识,了解了静态成员变量,及与普通成员变量的区别;
- 了解到静态成员变量的内存数据,以及简单的使用方法;
- 了解到静态函数,且静态函数内部不能使用非静态的成员变量;
- 了解到静态代码块,及其作用;
- 继续努力学习呀~~~加油!