Java关键字-static

一、static关键字

作用域:static可以修饰 方法,变量,代码块。

作用:

  • 支持未创建对象的情况下,直接通过类本身进行调用。
  • 节省内存空间,被修饰的部分在内存中只有一个副本。对于多次进行相同内容实例化的部分,可以通过static关键字修饰,从而达到节省内存的效果。

静态方法内部不可以引用非静态方法或者变量。但是在非静态方法中可以访问静态的变量和方法。其原因在于:静态变量或者方法,在类第一次被加载的时候就会被初始化。而非静态变量或者方法需要依赖于类的对象,在创建对象时候被初始化。静态变量和方法只有一个内存副本,所有对象共享的。

二、可以通过静态代码块来优化程序;

每个类的对象在加载时候都会用到的部分,可以用静态代码块来声明。

三、静态方法相关的访问顺序:

以上代码打打印顺序是什么样子的:(static→成员变量→构造器,先父类再子类)

首先寻找main方法,main方法是程序的入口。想使用main方法,必然需要加载main方法所在的类Test。这是Test类的第一次加载,所以会初始化static修改的部分。表现在代码中,则是输出:

test static

加载Test类的时候会按照程序的顺序先执行static修饰部分,所以第二步初始化main方法,执行其中的new MyClass(),而MyClass()未被加载过,所以要先加载这个类。但是加载这个类的时候会发现他继承了父类Test,而父类Test已经被加载过了,所以直接加载MyClass。表现在代码中,则是输出:

myclass static

类加载完成之后,就会通过构造器来生成对象。而在生成对象的时候会首先初始化父类的成员变量。因此会执行Person person = new Person(“Test”)。此时发现Person类未被加载过,所以需要先加载Person类。因为会初始化静态代码块,然后在调用构造器。表现在代码中,则是输出:

person static
person Test

父类的成员变量初始化完成以后,就开始执行父类的构造器。表现在代码中,则是输出:

test constructor

就要初始化自身的成员变量,则调用Person person = new Person(“MyClass”),由于Person已经加载过,就直接调用构造器。表现在代码中,则是输出:

person MyClass

最后执行MyClass的构造器。表现在代码中,则是输出:

myclass constructor

虽然在main方法中没有任何语句,但是还是会输出,理由同上。

问题:静态变量 和 常量(final)的区别?

  • 静态变量 和 常量 都是类属性,不需要实例化就可以访问,随着类的加载而加载。
  • 常量:类的不可变属性
  • 静态变量:类的可变属性

问题:同时被static和final修饰的变量可以在声明时候不进行初始化吗?
   不可以,因为静态变量在类第一次被加载的时候就会被初始化,final修饰的变量在初始化后值就不可以被修改了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值