java面向对象之static修饰符

Posted 柚子李子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,则所有人姓名都一样了,显然是不合理的)

  

 

以上是关于java面向对象之static修饰符的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象(OOP)--static修饰符(static变量static方法代码块和静态代码块创建和初始化对象的过程静态导入)

Java面向对象编程之Java语言中的修饰符

Java从入门到天黑|05JavaSE入门之面向对象(下)

Java从入门到天黑|05JavaSE入门之面向对象(下)

java面向对象之关键字,权限修饰符

Java面向对象--代码块(初始化块)和内部类