飞道的博客

Java 笔记分享 —— static 关键字

482人阅读  评论(0)

目录

1.1 前言

1.2 静态变量

1.3 静态方法

1.4 静态块

1.5 总结


1.1 前言

static 关键字也就是常说的静态,静态变量、静态方法等都是用它修饰的。static 关键字只能用来声明对象,不能用来实例化对象。

1.2 静态变量

静态变量在类加载时仅在类区域中获得一次内存,可以节省程序内存。

没有 static 的实例


  
  1. class Counter {
  2. int count = 0; // 区别在这里,没有static
  3. Counter() { // 默认构造函数
  4. count++;
  5. System.out.println(count);
  6. }
  7. public static void main(String args[]) {
  8. Counter c1 = new Counter();
  9. Counter c2 = new Counter();
  10. Counter c3 = new Counter();
  11. // 三次实例化,在内存一共分配了三个内存来存放变量 count,所以一共有三个 conut
  12. }
  13. }

  
  1. 运行结果:
  2. 1
  3. 1
  4. 1

有 static 的实例


  
  1. class Counter {
  2. static int count = 0; // 区别在这里,有 static 的变量只初始化一次
  3. Counter() { // 默认构造函数
  4. count++;
  5. System.out.println(count);
  6. }
  7. public static void main(String args[]){
  8. Counter c1 = new Counter();
  9. Counter c2 = new Counter();
  10. Counter c3 = new Counter();
  11. // 虽然实例化三次对象,但因为 count 是静态变量,所以在内存中都是同一个位置,也就是同一个 count
  12. }
  13. }

  
  1. 运行结果:
  2. 1
  3. 2
  4. 3

1.3 静态方法

(1)静态方法可以直接调用静态变量或静态方法,但不能直接调用非静态变量或非静态方法。

直接调用非静态变量或非静态方法实例:


  
  1. class test {
  2. String str = "success"; // 没有 static 修饰,不能被静态方法直接调用
  3. void display(String str) { // 没有 static 修饰,不能被静态方法直接调用
  4. System.out.println(str);
  5. }
  6. public static void main (String[] args) { // main 方法也是静态方法
  7. display(str);
  8. }
  9. }

  
  1. 运行结果:(报错)
  2. 无法从静态上下文中引用非静态 变量 str
  3. 无法从静态上下文中引用非静态 方法 display(java.lang.String)

修改为:


  
  1. class test {
  2. static String str = "success"; // 有了 static 修饰,才能被静态方法直接调用
  3. static void display(String str) { // 有了 static 修饰,才能被静态方法直接调用
  4. System.out.println(str);
  5. }
  6. public static void main (String[] args) {
  7. display(str);
  8. }
  9. }

  
  1. 运行结果:
  2. success

(2)this 关键字不能在静态方法中使用

非静态方法使用 this 关键字实例


  
  1. class A {
  2. String str = "try the static method with this"; // 实例变量
  3. void display(String str) { // 非静态方法
  4. System.out.println( this.str); // 打印实例变量,这里的 this 起到当前类的实例变量的作用
  5. }
  6. }
  7. class test {
  8. public static void main (String[] args) {
  9. A a = new A();
  10. a.display( "success"); // 调用 A 类中的 display 方法
  11. }
  12. }

  
  1. 运行结果:
  2. try the static method with this

静态方法使用 this 关键字的实例


  
  1. class A {
  2. String str = "try the static method with this"; // 实例变量
  3. static void display(String str) { // 静态方法
  4. System.out.println( this.str); // 这里是错误的,静态方法里不能使用 this 关键字
  5. }
  6. }
  7. class test {
  8. public static void main (String[] args) {
  9. A a = new A();
  10. a.display( "success"); // 调用 A 类中的 display 方法
  11. }
  12. }

  
  1. 运行结果:(报错)
  2. 无法从静态上下文中引用非静态 变量 this

(3)super 关键字不能在静态方法中使用

非静态方法中使用 super 关键字的实例


  
  1. class A {
  2. void a() {
  3. System.out.println( "test the super in the static method");
  4. }
  5. }
  6. class test extends A {
  7. void display() {
  8. super.a(); // 用 super 可直接调用父类中的方法
  9. }
  10. public static void main(String[] args) {
  11. test t = new test();
  12. t.display();
  13. }
  14. }

  
  1. 运行结果:
  2. test the super in the static method

静态方法中使用 super 关键字的实例


  
  1. class A {
  2. void a() {
  3. System.out.println( "test the super in the static method");
  4. }
  5. }
  6. class test extends A {
  7. static void display() { // 静态方法
  8. super.a(); // 这里是错误的,静态方法中不能使用 super 关键字
  9. }
  10. public static void main(String[] args) {
  11. display();
  12. }
  13. }

  
  1. 运行结果:(报错)
  2. 无法从静态上下文中引用非静态变量 super

(4)为什么 main 方法(主方法)是静态的?

因为 main 方法是要直接调用的,使用了 static 就可以直接调用了。如果不使用 static ,还需要创建一个对象来调用,这将导致内存分配问题。

1.4 静态块

(1)静态块用于初始化静态数据;

(2)静态块在 main 方法之前运行;

实例:


  
  1. class arithmetic {
  2. static int i; // 静态变量
  3. static { // 静态块
  4. i = 123;
  5. System.out.println( "static block run first"); // 静态块会首先运行
  6. }
  7. public static void main(String args[]) {
  8. System.out.print(i); // 因为是静态变量,可直接调用
  9. }
  10. }

  
  1. 运行结果:
  2. static block run first
  3. 123

1.5 总结

 


转载:https://blog.csdn.net/weixin_45330741/article/details/104965693
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场