目录
1.1 前言
static 关键字也就是常说的静态,静态变量、静态方法等都是用它修饰的。static 关键字只能用来声明对象,不能用来实例化对象。
1.2 静态变量
静态变量在类加载时仅在类区域中获得一次内存,可以节省程序内存。
没有 static 的实例
-
class Counter {
-
-
int count =
0;
// 区别在这里,没有static
-
-
Counter() {
// 默认构造函数
-
-
count++;
-
System.out.println(count);
-
-
}
-
-
public static void main(String args[]) {
-
-
Counter c1 =
new Counter();
-
Counter c2 =
new Counter();
-
Counter c3 =
new Counter();
-
// 三次实例化,在内存一共分配了三个内存来存放变量 count,所以一共有三个 conut
-
-
}
-
-
}
-
运行结果:
-
1
-
1
-
1
有 static 的实例
-
class Counter {
-
-
static
int count =
0;
// 区别在这里,有 static 的变量只初始化一次
-
-
Counter() {
// 默认构造函数
-
-
count++;
-
System.out.println(count);
-
-
}
-
-
public static void main(String args[]){
-
-
Counter c1 =
new Counter();
-
Counter c2 =
new Counter();
-
Counter c3 =
new Counter();
-
// 虽然实例化三次对象,但因为 count 是静态变量,所以在内存中都是同一个位置,也就是同一个 count
-
-
}
-
-
}
-
运行结果:
-
1
-
2
-
3
1.3 静态方法
(1)静态方法可以直接调用静态变量或静态方法,但不能直接调用非静态变量或非静态方法。
直接调用非静态变量或非静态方法实例:
-
-
class test {
-
-
String str =
"success";
// 没有 static 修饰,不能被静态方法直接调用
-
-
void display(String str) {
// 没有 static 修饰,不能被静态方法直接调用
-
-
System.out.println(str);
-
-
}
-
-
public static void main (String[] args) {
// main 方法也是静态方法
-
-
display(str);
-
-
}
-
-
}
-
-
-
运行结果:(报错)
-
无法从静态上下文中引用非静态 变量 str
-
无法从静态上下文中引用非静态 方法 display(java.lang.String)
修改为:
-
class test {
-
-
static String str =
"success";
// 有了 static 修饰,才能被静态方法直接调用
-
-
static void display(String str) {
// 有了 static 修饰,才能被静态方法直接调用
-
-
System.out.println(str);
-
-
}
-
-
public static void main (String[] args) {
-
-
display(str);
-
-
}
-
-
}
-
运行结果:
-
success
(2)this 关键字不能在静态方法中使用
非静态方法使用 this 关键字实例
-
-
class A {
-
-
String str =
"try the static method with this";
// 实例变量
-
-
void display(String str) {
// 非静态方法
-
-
System.out.println(
this.str);
// 打印实例变量,这里的 this 起到当前类的实例变量的作用
-
-
}
-
-
}
-
-
class test {
-
-
public static void main (String[] args) {
-
-
A a =
new A();
-
a.display(
"success");
// 调用 A 类中的 display 方法
-
-
}
-
-
}
-
-
-
运行结果:
-
try the
static method
with
this
静态方法使用 this 关键字的实例
-
class A {
-
-
String str =
"try the static method with this";
// 实例变量
-
-
static void display(String str) {
// 静态方法
-
-
System.out.println(
this.str);
// 这里是错误的,静态方法里不能使用 this 关键字
-
-
}
-
-
}
-
-
class test {
-
-
public static void main (String[] args) {
-
-
A a =
new A();
-
a.display(
"success");
// 调用 A 类中的 display 方法
-
-
}
-
-
}
-
运行结果:(报错)
-
无法从静态上下文中引用非静态 变量
this
(3)super 关键字不能在静态方法中使用
非静态方法中使用 super 关键字的实例
-
class A {
-
-
void a() {
-
-
System.out.println(
"test the super in the static method");
-
-
}
-
-
}
-
-
class test extends A {
-
-
void display() {
-
-
super.a();
// 用 super 可直接调用父类中的方法
-
-
}
-
-
public static void main(String[] args) {
-
-
test t =
new test();
-
t.display();
-
-
}
-
-
}
-
运行结果:
-
test the
super
in the
static method
静态方法中使用 super 关键字的实例
-
class A {
-
-
void a() {
-
-
System.out.println(
"test the super in the static method");
-
-
}
-
-
}
-
-
class test extends A {
-
-
static void display() {
// 静态方法
-
-
super.a();
// 这里是错误的,静态方法中不能使用 super 关键字
-
-
}
-
-
public static void main(String[] args) {
-
-
display();
-
-
}
-
-
}
-
运行结果:(报错)
-
无法从静态上下文中引用非静态变量
super
(4)为什么 main 方法(主方法)是静态的?
因为 main 方法是要直接调用的,使用了 static 就可以直接调用了。如果不使用 static ,还需要创建一个对象来调用,这将导致内存分配问题。
1.4 静态块
(1)静态块用于初始化静态数据;
(2)静态块在 main 方法之前运行;
实例:
-
class arithmetic {
-
-
static
int i;
// 静态变量
-
-
static {
// 静态块
-
-
i =
123;
-
System.out.println(
"static block run first");
// 静态块会首先运行
-
-
}
-
-
public static void main(String args[]) {
-
-
System.out.print(i);
// 因为是静态变量,可直接调用
-
-
}
-
-
}
-
运行结果:
-
static block run first
-
123
1.5 总结
转载:https://blog.csdn.net/weixin_45330741/article/details/104965693
查看评论