• 深入理解static关键字


     1 class A{
     2     public int i = 10;
     3     public void show(){
     4         System.out.printf("%d",i);
     5     }
     6 }
     7 
     8 class M{
     9     public static void main(String[] args){
    10         A a1 = new A();
    11         A a2 = new A();
    12         
    13         a1.i = 20;
    14         a2.show();//此时输出10
    15     }
    16 }
     1  /*
     2      本程序证明了:A类的多个对象共用一个static属性i
     3  */
     4  class A{
     5     public static i = 10; //加上static修饰符
     6     public void show(){
     7         System.out.printf("%d",i);
     8     }
     9 }
    10 
    11 class M{
    12     public static void main(String[] args){
    13         A a1 = new A();
    14         A a2 = new A();
    15         A a3 = new A();
    16         
    17         a1.i = 20;
    18         a2.show();//此时输出20
    19         System.out.printf("%d",a3.i);//也输出20
    20     }
    21 }

    结论:

    如果给一个属性加上static,那么这个属性不再属于某一个对象了,而是属于N个对象,共用同一个static属性。

    static修饰的方法和成员,在类加载的时候,一起加载进虚拟机。优先于对象的创建。static属性在一个单独的内存区,而不是在new出的对象内存中。所以下面的代码范例,可以直接由类名调用,不需要类对象名

     1  /*
     2      本程序证明了:static属性i是属于类本身的,或者讲:没有对象,我们仍然
     3      可以通过类名的方式访问类内部的static属性。static方法同理
     4  */
     5  class A{
     6      //给属性和方法加上static修饰符
     7     public static i = 10; 
     8     public static void f(){
     9         System.out.printf("20");
    10     }
    11 }
    12 
    13 class M{
    14     public static void main(String[] args){
    15     System.out.printf("%d",A.i);//输出10
    16     A.f();//输出20
    17     }
    18 }

      显然,static属性和方法虽然属于类本身,可以通过类名的方式访问,但是也属于类对象,也可以通过类对象名的方式访问,

    static只是表明了该成员具有了可以通过类名访问的潜在特征,但是是否可以通过类名访问,还必须满足一个条件:该成员必须是非private的

    重点:

    非静态方法可以访问静态成员(包括属性和方法)

    非静态方法的创建在类对象和static成员的创建之后!

    所以静态方法不可以访问非静态成员,因为静态成员可以直接由类名访问,非静态成员必须要有类对象名才能访问。

    有静态方法的时候不一定创建了非静态方法,但是有非静态方法的时候一定能创建了静态方法

  • 相关阅读:
    Centos安装mysql 5.6
    Cache和Buffer都是缓存,主要的区别是什么?
    服务器遭受攻击后的处理过程
    划船学python——语法(二)循环语句
    划船学python——语法(一)条件语句
    划船学python——初识数据类型
    FTP与SFTP区别
    说一说Nginx Proxy配置
    Virtual Box 中的虚拟系统无法调整分辨率(无法自适应窗口大小)
    [error]subprocess.CalledProcessError: Command '['which', 'g++']' returned non-zero exit status 1.
  • 原文地址:https://www.cnblogs.com/sunbr/p/11478272.html
Copyright © 2020-2023  润新知