目录
一、static关键字。
(1)牛客网题目。
(2)总结。
<1>静态变量。(类变量)
1、特点。
2、补充与注意。
3、代码演示。
<2>静态方法
1、特点。
2、补充与注意。
3、代码演示。
<3>静态代码块。
1、特点。
2、补充与注意。
3、代码演示。
<4>静态内部类。
1、特点。
2、注意事项。
3、代码演示。
一、static关键字。
(1)牛客网题目。
题目:关于static说法不正确的是?
答案:D。
优秀评论:
(2)总结。
- 在Java中,static关键字是一个非常重要的修饰符。它有多种用途:主要用于修饰变量、方法、代码块和内部类。
<1>静态变量。(类变量)
1、特点。
- 程序中使用static修饰属性,则该属性称为静态属性。(全局属性)
- 静态变量属于类,而不是类的实例(对象)。
- 静态变量在类加载时初始化,且只初始化一次。
- 可以通过类名直接访问,也可以通过实例访问(但不推荐)。
- 静态变量在内存中只有一份,无论创建多少个对象,静态变量都共享这一份内存。
2、补充与注意。
- static不能修饰局部变量。否则编译器会报错!
- 例如下面的代码是不合法的!
3、代码演示。
public class MyClass { static int staticVar = 10; } // 访问方式 MyClass.staticVar = 20; // 通过类名访问 MyClass obj = new MyClass(); obj.staticVar = 30; // 通过实例访问(不推荐)
<2>静态方法
- 通常如果想要使用类中的成员方法,就需要先将这个类实例化。
- 实际开发中,开发人员可以通过类名直接调用某个需要的方法。(静态方法)只需要在成员方法前加上static关键字即可。
1、特点。
- 静态方法属于类,而不是类的实例。
- 静态方法不能直接访问实例变量或实例方法(除非通过对象引用)。
- 静态方法可以通过类名直接调用,也可以通过实例调用(但不推荐)。
- 静态方法中不能使用
this
或super
关键字。
2、补充与注意。
- 静态方法只能访问静态成员。
- 非静态成员需要先创建对象才能访问,即随着对象的创建,非静态成员才会分配内存!而静态方法在被调用时可以不创建任何对象。
- 静态方法不能直接访问实例成员,但可以通过对象引用访问。
3、代码演示。
public class MyClass { static void staticMethod() { System.out.println("This is a static method."); } } // 调用方式 MyClass.staticMethod(); // 通过类名调用 MyClass obj = new MyClass(); obj.staticMethod(); // 通过实例调用(不推荐)
<3>静态代码块。
- 在Java类中,用static关键字修饰的代码块被称为静态代码块。
1、特点。
- 当类被加载时,静态代码块就会执行。(由于类只加载一次,静态代码块在类加载时执行,所以只执行一次)
- 常用于静态变量的复杂初始化。
- 多个静态代码块按照出现的顺序执行。
2、补充与注意。
- 代码块的执行顺序:静态代码块——>构造代码块——>构造方法。
- static修饰的代码块会随着class文件一同加载,属于优先级最高的代码块。
3、代码演示。
public class MyClass { static int staticVar; static { staticVar = 20; System.out.println("Static block executed.(静态代码块被执行!)"); } }
<4>静态内部类。
- 静态内部类,就是使用static关键字修饰的成员内部类。
- 静态内部类只能访问外部类的静态成员。
1、特点。
- 静态内部类不依赖于外部类的实例。
- 静态内部类可以直接通过外部类名访问,而不需要外部类的实例。
- 静态内部类不能访问外部类的非静态成员。(变量和方法)
2、注意事项。
- 通过外部类访问静态内部类成员时,因为程序已经提前在静态常量区为静态内部类分配好了内存。
- 所以即使静态内部类没有加载,依然可以通过外部类直接创建一个静态内部类对象。
- 静态内部类不依赖于外部类的实例,可以直接通过外部类名访问。
- 创建静态内部类对象的语法如下。
外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名 ();
3、代码演示。
- 外部类:"Test02"。
- 静态内部类:"Inner"。
/*** @Title: Test02* @Author HeYouLong* @Package PACKAGE_NAME* @Date 2024/10/31 上午11:46* @description: 测试类02*/ public class Test02 {static int m =666;static class Inner{int n = 1;void showOuterClass(){System.out.println("访问到外部类的静态成员变量m="+m);}}public static void main(String[] args) {Test02.Inner inner = new Test02.Inner();inner.showOuterClass();} }
- 结果测试。