由static修饰的变量称为静态变量,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象的特殊描述。

不同的对象的实例变量将被分配不同的内存空间, 如果类中的成员变量有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量,也就是说对象共享类变量。

成员变量和类变量的区别

1、两个变量的生命周期不同

成员变量随着对象的创建而存在,随着对象的回收而释放。

静态变量随着类的加载而存在,随着类的消失而消失。

2、调用方式不同

成员变量只能被对象调用。

静态变量可以被对象调用,还可以被类名调用。

3、别名不同

成员变量也称为实例变量。

静态变量也称为类变量。

4、数据存储位置不同

成员变量存储在堆内存的对象中,所以也叫对象的特有数据。

静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

static 关键字,是一个修饰符,用于修饰成员(成员变量和成员函数)。

特点:

1、想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。

2、被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。

3、静态随着类的加载而加载。而且优先于对象存在。

弊端:

1、有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。这样对事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。

2、静态方法只能访问静态成员,不可以访问非静态成员。

因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。

3、静态方法中不能使用this,super关键字。

因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。

什么时候定义静态成员呢?或者说:定义成员时,到底需不需要被静态修饰呢?

成员分两种:

1、成员变量。(数据共享时静态化)

该成员变量的数据是否是所有对象都一样:

如果是,那么该变量需要被静态修饰,因为是共享的数据。

如果不是,那么就说这是对象的特有数据,要存储到对象中。

2、成员函数。(方法中没有调用特有数据时就定义成静态)

如果判断成员函数是否需要被静态修饰呢?

只要参考,该函数内是否访问了对象中的特有数据:

如果有访问特有数据,那方法不能被静态修饰。

如果没有访问过特有数据,那么这个方法需要被静态修饰。

成员变量和静态变量的区别

1、成员变量所属于对象。所以也称为实例变量。

静态变量所属于类。所以也称为类变量。

2、成员变量存在于堆内存中。

静态变量存在于方法区中。

3、成员变量随着对象创建而存在。随着对象被回收而消失。

静态变量随着类的加载而存在。随着类的消失而消失。

4、成员变量只能被对象所调用 。

静态变量可以被对象调用,也可以被类名调用。

所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。

静态变量(类变量)和非静态变量(成员变量、实例变量)的区别相关推荐

  1. JAVA错误:无法从静态上下文中引用非静态变量 this

    新学习:构造方法的重载,给成员变量赋值 错误代码: class Student {public static void main(String[] args) {Person p = new Pers ...

  2. 浅谈 JAVA中静态初始化块和非静态初始化块的区别

    众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...

  3. java中代码块之静态代码块和非静态代码块

    一.代码块: 语法:使用{}包裹的,可以在{}中写代码. 修饰符:static 或者不修饰. static修饰的为静态代码代码块. 格式: //静态代码块,随着类的加载児执行static{System ...

  4. 静态代码块、非静态代码块、构造函数三者执行顺序

    主要探讨一下关于静态代码块,非静态代码块,构造函数的执行顺序. 如有错误,欢迎指出. 首先: 静态成员变量和静态代码块的优先级是一样的,先定义的先执行. 在创建一个对象的时候会执行非静态代码块和构造函 ...

  5. 静态代码块和非静态代码块的区别

    摘自原文 小结: 1.静态代码块是在类加载时自动执行的,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块. 顺序: 静态代码块-->非静态代码块-->类构造方法. ...

  6. java静态代码块与非静态代码块比较

    得出结论1:非静态代码块不会在调用方法与成员时执行. 结论2:非静态代码块在创建实例时执行 结论3:非静态代码块每次创建实例时执行,而静态代码块只执行一次 结论4:静态代码块优先非静态代码块优先构造函 ...

  7. 静态代码块、非静态代码块、构造函数执行顺序

    静态代码块.非静态代码块.构造函数执行顺序 /*** 类的实例化顺序,静态代码块.非静态代码块.构造函数.* @author MING*/ class Person {static String na ...

  8. 静态方法:无法在静态上下文中引用非静态

    如上是经典的Fobonacci递归算法: public class Fibonacci {public static void main(String []args){int x = f(6);Sys ...

  9. shaderTextView 闪动文字,static{}(静态代码块)与{}(非静态代码块)的异同点

    目录 shaderTextView  闪动文字 static{}(静态代码块)与{}(非静态代码块)的异同点 shaderTextView  闪动文字 package com.example.zhan ...

  10. java 代码块:静态代码块和非静态代码块

    main方法是程序的入口,加入没有main方法程序无法启动,但是main方法不是第一个执行的. 我认为:在这个类加载时,编译器会找到main方法,从这里开始运行,但是当你把这个类加载的时候,静态代码块 ...

最新文章

  1. 图像处理之基于阈值模糊
  2. 利用ViewPager+Fragment+actionbar实现可左右滑动的Action Tab
  3. s.assign()用法c++_assign是什么意思
  4. boost::fusion::traits用法的测试程序
  5. vue日期格式化实例
  6. python数据结构之树
  7. 这些年,NLP常见的预训练模型剖析
  8. SQL Server的聚集索引和非聚集索引
  9. 程序员,互联网创业者,忠言逆耳,希望创业者们慎重,三思而后行。
  10. 数据结构之基于Java的链接队列实现
  11. ubuntu14.04升级以及gitlab升级
  12. 过年了,就别再背电脑回家。
  13. Under the Hoods of Cache Fusion, GES, GRD and GCS
  14. MFC基础教程之窗口定义(一)
  15. Rider编译UE5项目RD报错
  16. 王松波 计算机科学,王松波-华南农业大学华南农业大学动物科学学院
  17. html问号字符串,问号html
  18. 5.3 项目:超级秒表
  19. 字节跳动布局游戏,打算从腾讯的碗里“抢饭吃”?
  20. skyline三维地图与arcgis二维地图联动

热门文章

  1. 编写跨平台Java程序注意事项
  2. dwz使用mysql_Dwz_group
  3. 心电图实验(使用vivado进行编程,VHDL语言)
  4. Vue3中Vuex的使用
  5. 巧为tomcat插件配置log4j日志,解决未报错启动不成功
  6. 简单c语言飞碟射击游戏
  7. 羲云社区团购微信小程序 活动详细页 (界面及功能设计)
  8. Python从入门到精通— 初识Python
  9. launch 启动脚本_使用Microsoft Speed Launch快速启动快捷方式
  10. libcurl模拟hi百度登陆