ToB企服应用市场:ToB评测及商务社交产业平台

标题: 一文讲清楚static关键字 [打印本页]

作者: 农民    时间: 2024-8-23 19:49
标题: 一文讲清楚static关键字
static能修饰的地方

初始化次序

  1. public class InitOrder {
  2.     // 静态属性
  3.     private static String staticField = getStaticField();
  4.     // 静态代码块
  5.     static {
  6.         System.out.println(staticField);
  7.         System.out.println("静态代码块初始化");
  8.     }
  9.     // 普通属性
  10.     private String field = getField();
  11.     // 普通代码块
  12.     {
  13.         System.out.println(field);
  14.         System.out.println("普通代码块初始化");
  15.     }
  16.     // 构造方法
  17.     public InitOrder() {
  18.         System.out.println("构造方法初始化");
  19.     }
  20.     // 静态方法
  21.     public static String getStaticField() {
  22.         String staticFiled = "静态属性初始化";
  23.         return staticFiled;
  24.     }
  25.     // 普通方法
  26.     public String getField() {
  27.         String filed = "普通属性初始化";
  28.         return filed;
  29.     }
  30.     public static void main(String[] argc) {
  31.         new InitOrder();
  32.     }
  33.     /**
  34.      *      静态属性初始化
  35.      *      静态代码块初始化
  36.      *      普通属性初始化
  37.      *      普通代码块初始化
  38.      *      构造方法初始化
  39.      */
  40. }
复制代码
静态方法和变量能否被继承

先说结论:能
父类A:
  1. public class A {
  2.     public static String staticStr = "A静态属性";
  3.     public String nonStaticStr = "A非静态属性";
  4.     public static void staticMethod(){
  5.         System.out.println("A静态方法");
  6.     }
  7.     public void nonStaticMethod(){
  8.         System.out.println("A非静态方法");
  9.     }
  10. }
复制代码
子类B:
  1. public class B extends A{
  2.     public static String staticStr = "B改写后的静态属性";
  3.     public String nonStaticStr = "B改写后的非静态属性";
  4.     public static void staticMethod(){
  5.         System.out.println("B改写后的静态方法");
  6.     }
  7.     @Override
  8.     public void nonStaticMethod() {
  9.         System.out.println("B改写后的非静态方法");
  10.     }
  11. }
复制代码
子类C:
  1. public class C extends A{
  2. }
复制代码
测试:
  1. public class Demo {
  2.     public static void main(String[] args) {
  3.         C c = new C();//C的引用指向C的对象
  4.         System.out.println(c.nonStaticStr);//A非静态属性
  5.         System.out.println(c.staticStr);//A静态属性
  6.         c.nonStaticMethod();//A非静态方法
  7.         c.staticMethod();//A静态方法
  8.         //推出静态属性和静态方法可以被继承
  9.         System.out.println("-------------------------------");
  10.         A c1 = new C();//A的引用指向C的对象
  11.         System.out.println(c1.nonStaticStr);//A非静态属性
  12.         System.out.println(c1.staticStr);//A静态属性
  13.         c1.nonStaticMethod();//A非静态方法
  14.         c1.staticMethod();//A静态方法
  15.         //推出静态属性和静态方法可以被继承
  16.         System.out.println("-------------------------------");
  17.         B b = new B();//B的引用指向B的对象
  18.         System.out.println(b.nonStaticStr);//B改写后的非静态属性
  19.         System.out.println(b.staticStr);//B改写后的静态属性
  20.         b.nonStaticMethod();//B改写后的非静态方法
  21.         b.staticMethod();//B改写后的静态方法
  22.         System.out.println("-------------------------------");
  23.         A b1 = new B();//A的引用指向B的对象
  24.         System.out.println(b1.nonStaticStr);//A非静态属性
  25.         System.out.println(b1.staticStr);//A静态属性
  26.         b1.nonStaticMethod();//B改写后的非静态方法
  27.         b1.staticMethod();//A静态方法
  28.         //结果都是父类的静态方法,说明静态方法不可以被重写,不能实现多态
  29.     }
  30. }
复制代码
注意

静态变量尤其要注意并发问题。因为静态变量在Java中是类级别的变量,它们被所有类的实例共享。由于静态变量是共享资源,当多个线程同时访问和修改静态变量时,就会引发并发问题。
总结

关于作者

来自一线程序员Seven的探索与实践,持续学习迭代中~
本文已收录于我的个人博客:https://www.seven97.top
公众号:seven97,欢迎关注~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4