java里,类的成员可分为静态成员和非静态成员(实例成员),静态成员和非静态成员,从定义上来说就是有没有static修饰符修饰的区别。有static修饰的成员就是静态成员。如

public static void fun1();//静态方法fun1
public void fun2();//非静态方法fun2
public static int a//静态变量a
public int b;//非静态变量b


关于static修饰符的意义:

java中的“static”和C++中的“static”含义并不完全一样!!!C++中的关键字static被复写了三次,有三种含义,分别为:

  1. 变量一直存在;
  2. 不能被其他文件访问的全局变量和函数;
  3. 属于类且不属于对象的全局变量和函数。

在一大部分人心中可能只把它理解为“静态”的意思,实际上Java仅仅取了C++中static的最后一个含义:即,不与类的实例相关联,仅与类相关联。
(斜体部分源自知乎:https://www.zhihu.com/question/20834765/answer/16364708)

静态成员:

①有static修饰符修饰,属于一个类而不是某个对象。

②使用方法: 类名.静态成员名,也可以对象名.静态成员名.静态成员名,但不建议这么做因为不规范,IDE会报警告

③生存期:当类的字节码被加载到内存时,静态方法和静态变量就会被分配内存,直到程序结束时,静态成员的所占内存才会被释放。

④静态成员在该类的每一个对象中都是相同的

⑤静态方法不可以直接调用非静态方法和非静态变量

public  class TestForStatic {private static int a=1;private int b=2;public static void staticFun(){a++;//Cannot make a static reference to the non-static field bnonStaticFun();//Cannot make a static reference to the non-static method nonStaticFun() from the type TestForStaticpublic void nonStaticFun(){a++;b++;}}


非静态成员:

①非静态成员也叫实例成员,它是属于某个对象的,而非类。

②使用方法:对象名.非静态成员名

③生存期:当新建一个对象时,该对象的实例变量就会被分配内存(实例方法在类的字节码被加载到内存是已经被分配了内存,只是不创建一个对象就无法调用),而当程序运行到对象的作用域外时,对象所占内存会被释放,而此时实例成员所占内存就会被释放掉

④非静态方法可以直接调用静态成员和非静态成员

对于静态方法不能直接调用非静态方法和非静态变量的理解:

对于非静态方法,它除了参数列表里的显式参数外还有一个隐式参数this(代表调用方法的对象),而静态方法并没有this参数,因此静态方法无法得知应该对哪一个对象的非静态成员进行操作。就好比你叫一个人吃馒头,又不告诉他吃谁的馒头,他就不知道要吃谁的馒头了

也有一种说法是,静态成员的作用域比非静态成员的作用域广,静态方法存在时,也许并没有对象的实例成员,因此无法对非静态成员进行操作。就好比你饿了想吃馒头,然而根本就没有馒头,所以你就吃不了馒头了


什么时候使用静态成员比较好?(在网上到处找了一下)

①当类的所有对象需要共享某个数据成员时,可将该数据设为静态数据成员,如Student类的studentnumber。

②当某个方法具体实现与对象无关时,可将其设为静态方法。

③如果某个方法是用频率较高,或者方法本身通用性较强,无需初始化类成员变量,则可以使用静态方法,那样方便,速度也快.

最后附上我在某博客看到的一句话,“通过滥用静态方法以达到在面向对象的语言中继续进行面向过程的编程,这是很可怕的”

java学习总结(16.06.07)类的静态成员和非静态成员相关推荐

  1. Java学习(16)--System 类/Date 类/ Calendar类

    System (1)系统类 ,提供了一些有用的字段和方法 (2)成员方法  A:运行垃圾回收器 public static void gc() B:退出 jvm public static void ...

  2. java中calendarr,Java学习(16)--System 类/Date 类/ Calendar类

    System (1)系统类 ,提供了一些有用的字段和方法 (2)成员方法 A:运行垃圾回收器 public static void gc() B:退出 jvm public static void e ...

  3. java学习第16天

    java学习第16天 多线程 进程和线程 进程Process 每一个程序运行就会创建一个进程. 进程是由操作系统管理 每一个进程独享一段内存空间,进程之间互不干扰. 线程Thread 线程是进程的组成 ...

  4. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)

    强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...

  5. JAVA学习—定义标准的POJO类—2021-06-30

    JAVA学习-定义标准的POJO类-2021-06-30 如何定义一个"标准的类" 1.所有的成员变量都需要使用private关键字私有化(以确保数据安全) 2.为每一个成员变量编 ...

  6. Java学习笔记——正则表达式(Pattern类、Matcher类和PatternSyntaxException)

    目录 一.Pattern类 (一)Pattern 介绍 (二)Pattern 方法 二.Matcher类 (一)Matcher 类介绍 (二)Matcher 类方法 三.PatternSyntaxEx ...

  7. Java学习手册:Error(错误类)Exception(异常类)

    Java异常结构中定义有Throwable类,Exception和Error是其派生的两个子类,其中Exception表示由于网络故障.文件损坏.设备错误.用户输入非法等情况导致的异常.而Error表 ...

  8. java静态成员和非静态成员的区别

    static(静态)关键字      static关键字: 用于修饰成员(成员变量和成员函数)     被修饰后的成员具备以下特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类 ...

  9. java学习之路7——常用类

    一.Object类 超类.基类.左右类的直接或者间接父类,位于继承树的最顶层. 任何类,如果没有写extends显示继承某个类,默认都直接继承Object类.否则为间接继承. Object类中所定义的 ...

最新文章

  1. CSS基础必备盒模型及清除浮动
  2. 公司上网速度极慢(断网)解决思路_网络TS
  3. 类的加载顺序和静态代码块和匿名代码块的区别
  4. Linux CPU信息和使用情况查看(CentOS)
  5. SCRUM Beta Day 3
  6. c# 整个工程(包括窗体工程)做成dll
  7. mysql数据库补充知识3 查询数据库记录信息之多表查询
  8. FDDB和LFW到底是个啥?
  9. java编程语言基础
  10. NFS PRC端口映射器
  11. linux heartbeat rpm,linux之heartbeat高可用的简单配置
  12. 单片机电子密码锁C语言程序,以STC89C52单片机为核心的电子密码锁设计
  13. 阿里云国际站怎么注册?
  14. 圣诞表白html,圣诞节表白语 圣诞节表白情话
  15. python实现淘宝客服自动回复语_Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例...
  16. SpringMVC总结笔记
  17. 龙芯粉的“芯”动日记
  18. 解决删除谷歌浏览器chrome注册表残留问题
  19. 高等数学(第七版)同济大学 习题8-5 个人解答
  20. 基于JSP酒店预订系统

热门文章

  1. 【Linux】Linux内核数据结构:IDR(redix树)
  2. c语言第七章函数笔记,我的C语学习笔记-C语言教程(七).doc
  3. GIT 命令学习:获取与创建项目
  4. Codeforces 1077b Disturbed People
  5. 教你如何焊接BGA芯片技巧
  6. Linux WIFI模块驱动移植
  7. 计算机开机主机不停地重启,求救:电脑一直重启,开机自检后,一会就重启
  8. SNARK性能及安全——Prover篇
  9. 使用 Scrapy 框架对重复的 url 无法获取数据,dont_filter=True
  10. 标注线段长度批量lisp_晓东CAD家园-论坛-每日插件-求批量多线段长度标注-求批量多线段长度标注插件!万分感谢!!! - Powered by Discuz!...