静态对象的数据全局唯一,static和final修饰成员变量与方法

静态对象的数据具有全局唯一性,一旦修改,所有相关数据都会同步更新。引用操作简便,只需通过类名加静态方法名或静态变量名即可直接调用和修改,无需使用get和set方法。这样的设计确保了数据的一致性,任何一处修改都会影响到所有引用该数据的地方,从而有效降低了不必要的资源消耗。static与final关键字用于修饰成员变量和方法,可以将其视为“类级别的常量”。变量一旦被赋予值便无法更改,而方法则表示不可被子类覆盖。在一般情况下,静态变量、静态方法和静态块作为类成员,需要通过类的实例来访问。然而,若在成员声明前加上static关键字,便可以创建一个无需依赖任何对象的成员,它可以直接通过类本身进行访问。将变量与函数都设定为静态类型,其中最典型的情形就是 main() 函数。这类静态方法存在一些限制条件,比如静态块仅在类被载入时执行一次。以下示例中,我们可以看到一个包含静态方法、静态变量以及静态初始化块的类。

静态对象的数据全局唯一,static和final修饰成员变量与方法

public class TestNew {
    static int a = 3;
    static int b;
    static void meth(int x){
        System.out.println("x = "+x);
        System.out.println("a = "+a);
        System.out.println("b = "+b);
    }
    static {
系统输出:“静态块已初始化”
        b = a*4;
    }
此方法尚未完成,系自动生成之模板。
        meth(42);
    }
} 

执行结果是:

static block initialized

x = 42

a = 3

b = 12

上述TestNew类的执行流程如下:首先执行static块,输出一条信息,随后将变量a赋值为3,最后将变量b初始化为a的4倍,即12。接着调用main()方法,main()方法中又调用了meth()方法,并将数值42传递给变量x。在随后的三个println()语句中,分别引用了两个static变量a和b,以及局部变量x。

外部使用静态方法或静态变量

class StaticDemo{  
    static int a = 42;  
    static int b = 99;  
    static void callme(){  
        System.out.println("a = "+a);  
    }  
}  
public class TestNew {  
此处为自动生成的方法框架,尚未进行具体实现。
        StaticDemo.callme();  
输出语句显示,变量b的值为StaticDemo类中的静态成员变量b的当前值。
    }  
}  

执行结果:

a = 42
b = 99

静态内部类

在某个类体内,若以static关键字进一步修饰另一个类,这样的静态内部类之所以被采用,是因为它与外部类存在某种关联性。通常情况下,只有外部类需要引用内部类,所以无需为这个类单独创建一个Java文件。编译成功后,将会生成两个class文件,分别是OuterClass.class和OuterClass$InnerClass.class。

静态方法以及静态成员变量,其存在意义在于伴随类被加载而出现(而非对象的生成),从而允许通过类名加静态成员名的方式直接访问。基于此,我们可以对静态内部类有更清晰的认识:它能够通过外部类名加内部类名的方式直接访问(仅限于内部类的静态成员,非静态成员则需通过内部类实例对象来访问)。

public class OuterClass{
private String out_str1 = "此为外部类中的非静态属性";
私有静态字符串成员名为out_str2,其值为"外部类静态成员"。
    
公开定义了一个内部类,名为InnerClass。
私有静态字符串变量str被赋值为"Java学习"。
public String str1; str1赋值为"静态内部类学习";
         public  void display1(){
直接输出字符串变量out_str2,访问外部类的静态成员。
         }
public static void 展示信息2方法(){}
由于外部类的非静态成员无法直接被访问,因此不能直接打印出out_str1。
         }
     }
    
    public void printInfo(){
        
在输出语句中,通过System.out.println()方法,我们能够直接引用OutClass类中的InnerClass内部类的静态字符串成员str。
在访问静态内部类的非静态成员时,必须先创建一个内部类的实例,例如:InnerClass inner = new InnerClass();
系统输出内部字符串str1的内容。
          inner.display1();
         
    }
     
创建了一个名为OutClass的对象实例,并赋值给变量OutClass out。
         out.printInfo();
         
     }
}

静态内部类无法直接访问外部类的非静态元素,这一规定源于Java语言规范中关于“静态方法无法直接引用非静态成员”的约束。若需访问外部类的变量,需采用其他技术手段,正因如此,静态嵌套类的应用并不普遍。需留意,外部类对内部类成员的访问存在特定规则,非静态成员无法直接被访问,而需借助内部类进行访问;而对于静态内部类的成员,则可以通过外部类名加内部类名的方式直接获取。此外,静态内部类InnerClass仅在OutClass的作用域内可见,若在其他类中引用或进行初始化,则会导致错误。非静态内部类

public class Outer {   
           int outer_x = 100;  
    class Inner{  
      public int y = 10;  
      private int z = 9;  
      int m = 5;  
      public void display(){  
输出信息显示:“外部变量outer_x的值为:”+ outer_x;
      }  
private函数display2执行时,将进行展示操作。
        System.out.println("display outer_x:"+ outer_x);  
      }  
    }  
    void test(){  
内部内部类实例化了一个新的内部内部类对象; Inner inner 对象被创建,属于内部内部类。
      inner.display();  
      inner.display2();  
在程序中,我们无法直接输出内部变量y的值,因为其作用域被限制在内部函数中。
在程序中输出:"Inner对象的y属性值:" + inner.y,这一行代码表明了可以对其进行访问。
在输出语句中,我们能够看到"Inner z:"后面跟随的值,即inner对象中的z属性,这是可以访问的。
System.out.println("内部变量m的值为:" + inner.m);该变量是可以被访问的。
InnerTwo 类的一个实例被成功创建,名为 innerTwo。
      innerTwo.show();  
    }  
    class InnerTwo{  
内部内部类innerx被实例化为一个新对象,即new Inner();
      public void show(){  
输出语句显示:由于无法访问内部类的y成员,因此无法执行System.out.println(y);
由于Inner类的成员y无法直接被访问,因此无法直接输出其值。
调用innerx的display方法,权限得以实现访问。
内嵌的display2函数得以调用,权限不受限制。
在程序中,我们可以通过调用System.out.println方法,输出变量innerx的成员变量y的值,因为它们之间存在着可访问的关系。
可以直接输出innerx对象的z属性值。
系统输出显示innerx对象中的m属性值;允许对其进行访问。
      }  
    }  
public static void 主函数,String args[] 参数列表,进行定义。
创建了一个名为OuterOuter的新对象,实例化自Outer类。
      outer.test();  
    }  
  }  

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读