zoukankan      html  css  js  c++  java
  • 【Java基础】static关键字相关

        static关键字特点:

    • 随着类的加载而加载。
    • 优先于对象存在。
    • 被所有对象共享
    • 可以直接被类名调用。

        使用注意:

    • 静态方法只能访问静态成员。
    • 但非静态成员可以访问静态成员。
    • 静态方法中不能使用this,super关键字。
    • 主方法(main)是静态的。

        看了上面是不是想睡觉了,单纯的概念是挺烦人的,那下面让我们在实际代码中来加深对他们的认知。

       

        方法的调用可以分为两种:

    1. 对象调用: 对象.方法(实参)
    2. 类调用: 这个方法所在类的名字.方法(实参)//前提是这个方法必须被static修饰。

        没有使用static修饰的方法或字段,属于对象。为实例成员。

        使用static修饰的方法或字段,属于类。为类成员。

        对他们的调用:

        若是实例成员:只能通过对象来调用。

        若是类成员:可以通过类名调用,也可以通过对象来调用。

        好吧,下面小程序来了。

     1 class dog//一群狗狗
     2 {
     3     String name;
     4     int age;//没有使用static修饰,属于对象,为实例成员。
     5     //狗的名字,年龄,每只狗都不同,能随意变。
     6 
     7     static int num=100;//使用static修饰,属于类,为类成员。
     8     //而狗的总数是不变的。
     9 }
    10 
    11 class day5lesson2 
    12 {
    13     public static void main(String[] args) 
    14     {
    15         System.out.println("通过类名来调用类成员-->"+dog.num);//编译通过
    16         //System.out.println("通过类名来调用实例成员-->"+dog.name);//编译不通过
    17         System.out.println("通过对象来调用类成员-->"+new dog().num);//运行通过
    18         System.out.println("通过对象来调用实例成员-->"+new dog().name);//运行通过
    19     }
    20 }
    View Code

        上面代码中被注释掉的不能通过的代码的错题提示如下:

        上面程序也说明了上面提到的:若是实例成员:只能通过对象来调用。若是类成员:可以通过类名调用,也可以通过对象来调用。但是在调用类成员时建议用类名来调用,因为在底层,对象来调用类成员,也会转换为类名调用。

        下面必须提到的是:静态区域。它是在JVM内存中的一块专门存储类成员的存储区域。

        我们修改一下上面一段程序的主方法:

     1 class dog//一群狗狗
     2 {
     3     String name;
     4     int age;//没有使用static修饰,属于对象,为实例成员。
     5     //狗的名字,年龄,每只狗都不同,能随意变。
     6 
     7     static int num=100;//使用static修饰,属于类,为类成员。
     8     //而狗的总数是不变的。
     9 }
    10 class day5lesson2 
    11 {
    12     public static void main(String[] args) 
    13     {
    14         dog d1=new dog();
    15         dog d2=new dog();//声明2个对象
    16 
    17         d1.num=111;//用d1修改类成员。
    18         System.out.println("d1.num="+d1.num);
    19         System.out.println("d2.num="+d2.num);//输出
    20 
    21         d1.age=111;//用d1修改实例成员。
    22         System.out.println("d1.age="+d1.age);
    23         System.out.println("d2.age="+d2.age);//输出
    24     }
    25 }
    View Code

        结果如下:

        为什么是这种结果呢?这就是static修饰的字段属于类成员,存储在专门的静态区域中。(PS:在类加载时就为其创建空间,所以比较消耗性能)。一般static方法用在做工具类的方法的时候,如Arrays类(java.util.Arrays)中,大量使用static方法,可在JDK API中查看。

        而没被static修饰的age(实例成员)则不会有这种效果。(PS:int定义一个数字默认值为0,所以d2.age输出0)

       

  • 相关阅读:
    PAT (Advanced Level) Practice 1100 Mars Numbers (20分)
    PAT (Advanced Level) Practice 1107 Social Clusters (30分) (并查集)
    PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
    PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
    PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)
    PAT (Advanced Level) Practice 1110 Complete Binary Tree (25分) (完全二叉树的判断+分享致命婴幼儿错误)
    PAT (Advanced Level) Practice 1109 Group Photo (25分)
    PAT (Advanced Level) Practice 1108 Finding Average (20分)
    P6225 [eJOI2019]异或橙子 树状数组 异或 位运算
    P4124 [CQOI2016]手机号码 数位DP
  • 原文地址:https://www.cnblogs.com/zhubingqi/p/4060948.html
Copyright © 2011-2022 走看看