Java——static关键字总结(含义、定义属性或方法、使用时机)

举报
Winter_world 发表于 2021/09/28 23:40:03 2021/09/28
【摘要】 目录 1、声明static属性 2、声明static方法 3、分析主方法 3、static应用案例 1、声明static属性 static关键字,主要描述全局的概念,利用该属性可以定义属性和方法,但是90%情况下很少直接编写static。 现在假设定义一个只描述中国人的类,类中包含:姓名、年龄、国家,按之前的概念设计如下...

目录

1、声明static属性

2、声明static方法

3、分析主方法

3、static应用案例


1、声明static属性

static关键字,主要描述全局的概念,利用该属性可以定义属性和方法,但是90%情况下很少直接编写static。

现在假设定义一个只描述中国人的类,类中包含:姓名、年龄、国家,按之前的概念设计如下:


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Person perA = new Person("张三",10);
  4. Person perB = new Person("李四",20);
  5. Person perC = new Person("王五",10);
  6. System.out.println(perA.getInfo());
  7. System.out.println(perB.getInfo());
  8. System.out.println(perC.getInfo());
  9. }
  10. class Person{
  11. private String name;
  12. private int age;
  13. String country = "中华人民共和国"; //该属性暂时不封装
  14. public Person(String name, int age) {
  15. this.name = name;
  16. this.age = age;
  17. }
  18. public String getInfo(){
  19. return "姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country;
  20. }
  21. }

以上代码很简单,但是分析内存关系时就会发现问题:

以上红色标记的是重复的信息,在对象数量少的情况下没什么问题,但是在数据量大的情况下要修改属性信息,比如20亿,20亿对象要修改country属性,那是巨大的操作量~对整个代码 的维护很不友好。

造成以上问题的根源主要是:类中的普通属性是每一个对象独自拥有的,这样的设计不符号当前的环境,最好是将country设置为公共属性,所有对象都共享此属性,这时就可以通过static关键字实现。

【举例】:使用static关键字实现


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Person perA = new Person("张三",10);
  4. Person perB = new Person("李四",20);
  5. Person perC = new Person("王五",10);
  6. perA.country = "中国-唐朝";
  7. System.out.println(perA.getInfo());
  8. System.out.println(perB.getInfo());
  9. System.out.println(perC.getInfo());
  10. }
  11. class Person{
  12. private String name;
  13. private int age;
  14. static String country = "中国"; //该属性暂时不封装
  15. public Person(String name, int age) {
  16. this.name = name;
  17. this.age = age;
  18. }
  19. public String getInfo(){
  20. return "姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country;
  21. }
  22. }

由以上结果可知,修改了一个对象的属性后,所有对象的属性都一起更改,这样的属性称为公共属性,该属性必须通过static关键字定义,对于公共属性的内容保存不会在堆栈中,而是保存在全局数据区中,所有的方法保存在全局代码区之中。内存分析如下:

但是有这样一个问题,既然static属于全局属性,那么由一个对象进行修改很明显不合适,最好的做法是利用所有对象的一个最高代表进行操作,即类。对于static定义的属性可以由类.属性直接调用。这是比较标准的操作:

Person.country = "中国-唐朝";
 

此时类中存在static和非static属性:

  • 所有的普通属性都是在对象实例化的时候进行内存分配;
  • 而static可以在没有实例化对象产生的情况下直接使用。
        System.out.println(Person.country);

 


  
  1. Person.country = "中国-北宋";
  2. System.out.println(Person.country);
  3. System.out.println(new Person("张三",20).getInfo());

由以上操作可知,虽然static属性定义在类中,但它是完全独立的,不受对象实例化的控制。

大多数情况下类的设计都会使用非static属性,只有表示公共 属性或与类实例化无关的情况下才会考虑使用static。

2、声明static方法

利用static定义的属性可以直接通过类名称进行访问,static也可以用于方法的定义上,这个方法也同样可以由类名称直接进行调用。

【举例】:定义static方法


  
  1. class Person{
  2. private String name;
  3. private int age;
  4. private static String country = "中华人民共和国"; //该属性暂时不封装
  5. public Person(String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. public String getInfo(){
  10. return "姓名:"+this.name+",年龄:"+this.age+",国家:"+this.country;
  11. }
  12. public static String getCountry() {
  13. return country;
  14. }
  15. public static void setCountry(String country) {
  16. Person.country = country;
  17. }
  18. }

static的方法依然不受实例化的限制,所以可以直接由类名称直接调用。但是此类的方法就存在有两种了:static与非static,两者之间的访问就会出现问题,有如下语法规定:

  • 所有非static方法可以直接调用此类中的static方法或static属性。
  • static方法不能直接调用此类中的非static方法或非static属性。

【什么时候使用static方法】:

  • 类设计过程中,90%都使用非static方法;
  • 若类中没有任何属性,此类不需要定义普通方法,只需要定义static方法(比如开发中常用的自定义工具类,无需实例化对象,无需开辟无用的内存空间);

3、分析主方法

最早讲解方法定义的时候,实际上给出了两种方案:

  • 某方法定义在主类中,由主方法直接调用,格式:public static 返回值类型 方法名称(){};
  • 某方法定义在子类中,由实例化对象直接调用,格式:public 返回值类型 方法名称(){};

实际开发中,主类基本不会写太多方法,大部分方法都会封装在类中。

Java中的主方法是最长的:

  • public:一种访问权限,表示所有的操作者都可以看见;
  • static:执行类的时候输入:"java 类名称",表示由类直接调用;
  • void:主方法是程序的起点,无返回值;
  • main:系统定义好的方法名称;
  • String args[]:表示程序执行时的输入参数,初始化输入参数。

3、static应用案例

static在一些系统类库中大量出现,这些可能是因为定义static方法所导致。本次重点看static属性,该属性的一个最好的特点是公共属性,所有对象均可以对其进行修改。

【举例】:实现一个对象个数的统计

所有新的实例化对象产生时都会调用构造方法,可以在其中增加一个统计功能。


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. new Person();
  4. new Person();
  5. }
  6. class Person{
  7. private static int count = 0;
  8. public Person() {
  9. System.out.println("对象个数:"+count++);
  10. }
  11. }

【举例】:为属性自动命名


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. System.out.println(new Person().getName());
  4. System.out.println(new Person("张三").getName());
  5. }
  6. class Person{
  7. private static int count = 0;
  8. private String name;
  9. public Person(){
  10. this("无名氏-"+count++);
  11. }
  12. public Person(String name) {
  13. this.name = name;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. }

4、总结

1)类的设计过程中,首先可以不去考虑static属性或方法;

2)使用static方法,大部分情况下有两种可能性:

  • 希望不受类实例化的控制;
  • 类中没有普通属性;

 

作于202004061520,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/105342057

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。