• 【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)

       

  • 相关阅读:
    分析java程序的命令总结jps,jstack
    Tomcat配置详解及tomcat的连接数与线程池
    Go入门练习题
    WebSocket的原理,及如何测试websocket是否连接成功
    day3-每天进步一点基础知识-正则练习题
    day2-每天进步一点基础知识
    day1-每天进步一点
    数组有没有length()这个方法? String有没有length()这个方法?
    List, Set, Map是否继承自Collection接口?
    启动一个线程是用run()还是start()?
  • 原文地址:https://www.cnblogs.com/zhubingqi/p/4060948.html
Copyright © 2020-2023  润新知