zoukankan      html  css  js  c++  java
  • java面向对象之static修饰符

    在摆实例之前,先搞一些总结上去。。。。

    static(静态修饰符)

    1. static修饰成员变量 :如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。

      静态成员变量的访问方式:

        方式1: 可以使用对象进行访问。
          格式: 对象.变量名。

        方式二: 可以使用类名进行访问。
          格式: 类名.变量名;

    注意:
      1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。
      2. 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候
      才使用static修饰。

      static修饰成员变量的应用场景: 如果一个数据需要被所有对象共享使用的时候,这时候即可好实用static修饰。

    2. static修饰成员函数:(后续补充)---2020-04-08补充

      static静态修饰符不仅可以修饰成员变量,还可以修饰成员函数,

      静态函数(方法)在使用过程中的注意事项:

        1.静态方法可以使用对象或者类名调用,非静态方法只能使用对象调用

        2.静态方法可以调用静态成员变量,不能调用非静态成员变量和非静态方法,非静态方法可以调用非静态和静态的方法和变量;

        3.静态方法中不能使用this或者super关键字

      原因:静态数据是优先于变量存在于内存中的,非静态变量和函数是在新建对象的时候在内存中出现,而在创建对象之前静态数据就已经存在于静态方法区了(内存管理相关内容,不在赘述)

      使用场景:在不需要访问成员变量或方法的时候可以使用静态方法,一般用于工具类(不涉及数据传输,只涉及功能)

    ---------------------------------------------------------------------------------------------------------------------------------------------

      明白了以上东西后可以写一个例子;描述一个女子学校的学生

      首先我们看下没有static修饰的情况下,代码执行时的内存情况:

    先上代码:

     1 class Student{
     2     String name;  
     3     String  sex;      
     4     public Student(String name,String sex){
     5         this.name = name;
     6     }
     7 }
     8 
     9 class Main{
    10     public static void main(String[] args) 
    11     {
    12         Student s1 = new Student("周芷若","女");
    13         Student s2 = new Student("周敏","女");
    14         
    15         System.out.println("名字:"+ s1.name+"性别"+s1.sex);
    16         System.out.println("名字:"+ s2.name+"性别"+s2.sex); 

    17    }
    18 }

    如上代码在执行时在内存中的存储情况如图

      可以看到在上面的代码执行过程中每创建一个对象,就会在堆内存中保存一份姓名,一份性别,但是看需求,我们是要描述一个女子学校,那么女子学校当然只有女生了

    那么这种写法不想当于浪费内存了?

      解决办法:将性别作为一个可以公共访问的属性,让其在内存中只存一份

    那么代码来了。。。

     1 class Student{
     2     String name;  //非静态成员变量
     3     static String sex = "女";      //静态的成员变量        
     4     public Student(String name){
     5         this.name = name;
     6     }
     7 }
     8 
     9 class Main {
    10     public static void main(String[] args) 
    11     {
    12         Student s1 = new Student("周芷若");
    13         Student s2 = new Student("赵敏");
    14         System.out.println("名字:"+ s1.name+"性别"+s1.sex);
    15         System.out.println("名字:"+ s2.name+"性别"+s2.sex);
    16     }
    17 }

    如上将成员变量使用静态修饰符static修饰之后,它会在内存中存一份,所有对象都会调用到该成员变量,在内存中保存如下:

      说明:在内存中会有一个方法区(数据共享区),专门存放供公共调用得到数据或者方法

      当使用静态修饰符static修饰成员变量的时候,会把这个变量存放在方法区中,供所有对象去调用(当然它被修改,则其他对象调用时获取到的数据也会修改),当然我们在使用static的时候也一定要在需要的时候添加,否则会导致获取到重复数据(比如如果在上面例子中给name成员变量添加了static,则所有人姓名都一样了,显然是不合理的)

      

    —————————————————————————————————————————————————————————————————————————————————————————————————————————————— 保持学习的劲头
  • 相关阅读:
    默比乌斯函数
    勒让德符号相关
    微积分入门("SX"T版)
    分治法求2n个数的中位数
    SSM框架学习之高并发秒杀业务--笔记1-- 项目的创建和依赖
    10月9日Android学习笔记:活动与服务之间的通信
    高精度加法
    Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述
    郁闷
    素数链
  • 原文地址:https://www.cnblogs.com/qkblogs/p/12643973.html
Copyright © 2011-2022 走看看