java——static关键字的学习笔记

  • Static关键字的引入
  1. 被static关键字修饰的内容将成为对象的共有内容:

场景模拟:

假设现在有一个学生类:

Public class Student {

int age;

String name;

String schoolName;

假设由这个学生类new出来的对象均属于同一所学校,即他们的schoolName是相同的,那么我们每创建一个Student类的对象,都要为这个schoolName开辟内存空间,并赋值,这样做不仅增加了代码的重复性,也造成了内存空间的浪费(发现弊端)

(如何解决这个弊端呢?)共享数据的引入:

如果我们能单独开辟一个空间来存放schoolName这个属性,并让所有的Student类对象公用这一块内存空间,此时不就解决了上述问题吗?我们称此时的schoolName为Student类的共享数据

 

(如何实现数据的共享?)

Java为我们提供了static关键字,一旦某一数据被static关键字所修饰,那么该数据就将成为该类所有对象的共享数据

(特有数据和共享数据的区别:共享数据是指某一类对象所共同拥有的属性,如同一个学校的学生拥有同一个学校名称,而特有数据是指某个对象自己所拥有的属性,比如同一学校的不同学生的姓名,姓名往往是不同的)

  1. 静态成员和非静态成员的区别与联系:
  1. 调用方式上的区别与联系:

静态变量有两种调用方式:a.对象.的方式调用      b.类名调用

  1. 静态成员,被其中任何一个对象修改,那么其他所有对象调用该静态成员时,得到的均是被修改后的值,这也体现了数据的共享的特点

非静态成员,被他任何一个对象修改,不影响其他对象调用该成员变量时得到的值

本质上理解:静态成员不会随对象进入堆内存,他在编译时就已经被初始化,并被放进了单独的一块区域,而所有的对象均共享这块区域,共享该静态成员的值,因此一个对象修改了该静态成员的值,那么其他对象均要收到影响,而非静态成员是要随对象进入堆内存的,即每一个非静态成员均有自己独立的内存空间,因此当其中任何一个对象修改了非静态成员的值的时候,其他对象均不会受到影响

  1. 静态成员的加载内存解析

我们的内存主要是分为三大部分:1.栈内存  2.堆内存  3.方法区(也称为数据共享区)

Java程序运行的执行步骤:

  1. 首先是类进入方法区(一般都是main方法最先进入方法区)
  2. java虚拟机(JVM)会首先寻找类中的静态成员(一般会先找到main方法)找到静态成员后就将该静态成员送入数据共享区中的静态区,(静态区主要存放的就是静态成员)

(这里需要注意一件事情:静态成员进入静态区后也会被赋予初值,和成员变量赋初值是一样的:整型0     引用类型:null)

  1. 接着方法依次入栈执行(首先是mian方法压栈执行)
  2. 接着就是方法弹栈死亡
  1. 静态成员属于谁?

静态成员属于类本身,它不属于对象,而非静态成员属于对象

  1. 静态成员优先于非静态成员存在,一般非静态成员存在于对象创建之后,而静态成员存在于对象创建之前
  2. 静态的注意事项:
  1. 静态不能调用非静态:

原因就是静态成员的生命周期和非静态的生命周期不同,静态的生命周期大于非静态的生命周期,静态是在类加载入方法区的时候就存在了,而非静态成员是在对象创建后才存在,因此已经存在的不能够调用还未存在的,故静态不能调用非静态

总结:静态成员不能调用非静态成员,非静态成员可以调用静态成员,静态成员中不能出现super和this关键字,因为this和super分别代表子类和父类对象的引用,属于非静态

  1. 静态的使用场景:
  1. static能够修饰的数据:成员变量,成员方法
  2. 什么时候将成员变量定义为static,如果该事物是很多事物的共同属性,那么就将该成员变量定义为static
  3. 什么时候将方法定义为static,如果该方法没有调用过非静态成员,那么请将该方法定义为static
  1. 多态调用的细节补充:

多态调用中编译都看=左边的父类,父类有编译成功,父类没有编译失败

解释:当你用父类引用对象调用成员方法或者成员变量时,只看父类,如果父类中有该成员变量或者成员方法,那么就编译成功,否则编译失败

运行:静态方法,运行父类中的静态方法,非静态方法,运行子类的重写方法

解释:当你用父类对象调用子类中重写的父类的静态方法时,他只会运行父类中的静态方法,而不会运行子类中重写的静态方法,当你用父类对象调用子类中重写的父类的方法时,它只会调用子类的重写方法,而不会去调用父类的

成员变量:编译运行,全部都是父类

你用父类对象调用成员变量时,调用的是父类的成员变量

 

疑问:为什么用父类对象调用静态方法时,调用的是父类中的静态方法呢?

原因就在于,静态成员属于类,不属于对象

我们研究多态时,研究的是对象之间的多态性,而静态和对象无关

总结:在多态调用中,只有非静态的方法才会走子类重写,而其他的均要看父类,总之,多态就是为了调用父类和子类的公共方法属性

  1. 一般我们定义一个常量常定义为public static final  + 数据类型 + 常量名(经常使用大写) + 常量值
  2. 联系接口:接口中只能定义静态常量,调用方法,接口名 + .  + 常量名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值