在《Java编程思想》当中有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”

总结一下就是static:方便在没有创建对象的情况下来进行调用(方法/变量)

很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。


一、static内存使用

static关键字存储在我们的方法区当中的静态常量池当中,static修饰的方法、变量和代码块都是可以被用来共享的

 public class Person {private int age ;private String name;static String from;public Person(int age, String name) {super();this.age = age;this.name = name;}@Overridepublic String toString() {return "Person [age=" + age + ", name=" + name + ", from=" + from + "]";}public static void main(String[] args) {Person person1 = new Person(20,"张三");Person person2 = new Person(21,"李四");Person.from = "中国";System.out.println(person1.toString());System.out.println(person2.toString());}}

Person [age=20, name=张三, from=中国]
Person [age=21, name=李四, from=中国]

person1和person2的name和age属性的值都在堆内存当中进行存储,且是该对象私有的,但是from属性扥值是存储在方法区的静态常量池当中的,是属于公共的。

二、static修饰符

重点:static属于类

三、static 加载顺序

public class Test extends Base{static{System.out.println("test static");}public Test(){System.out.println("test constructor");}public static void main(String[] args) {new Test();}
}class Base{static{System.out.println("base static");}public Base(){System.out.println("base constructor");}
}

先来想一下这段代码具体的执行过程,在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Test类,而在加载Test类的时候发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类的时候,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new
Test()的时候会先调用父类的构造器,然后再调用自身的构造器。因此,便出现了上面的输出结果。


public class Test {Person person = new Person("Test");static{System.out.println("test static");}public Test() {System.out.println("test constructor");}public static void main(String[] args) {new MyClass();}
}class Person{static{System.out.println("person static");}public Person(String str) {System.out.println("person "+str);}
}class MyClass extends Test {Person person = new Person("MyClass");static{System.out.println("myclass static");}public MyClass() {System.out.println("myclass constructor");}
}
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor

类似地,我们还是来想一下这段代码的具体执行过程。首先加载Test类,因此会执行Test类中的static块。接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。在加载MyClass类的时候,发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类的中的static块。在加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量,因此会执行Test中的Person person = new Person(),而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块,接着执行父类的构造器,完成了父类的初始化,然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person(),最后执行MyClass的构造器。

有道云笔记更精彩哦~
文档:第十六课—static关键字.note

java基础第十七课----static关键字相关推荐

  1. java基础提升篇:Static关键字

    Static变量 static关键字 在类中用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时初始化,对于该类的所有对象来说,static成员变量只有一份. 可以通过引用或 ...

  2. Java基础:详解static关键字与类加载顺序

    1. 前言 前文中说到了static关键字,在Java中这是一个很重要的关键字,它有很多的用法,并且在某些特定的情况下使用可以优化程序的性能.本文学习static关键字的应用场景.在这之前了解变量的类 ...

  3. 重学java基础第十七课:java开发环境搭建

  4. JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

    JAVA基础-栈与堆,static.final修饰符.内部类和Java内存分配 发布时间: 2013/01/12 22:29 QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 百度空间 百度搜藏 开心网 ...

  5. java final static_Java基础之final、static关键字

    一.前言 关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高.接口中.常量.静态方法等等.但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来.下面,对这两个关键字的 ...

  6. 面向小姐姐的编程——java面向对象之final、static关键字

    文章目录 final关键字 final的概念 final的作用 修饰类: 修饰变量: 总结 代码示例 static关键字 static的概念 static的作用 调用方式 static修饰成员变量 特点: ...

  7. Java面向对象(15)--static关键字静态理解与使用

    类属性作为该类各个对象之间共享的变量.在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性.如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从 ...

  8. JAVA入门级教学之(static关键字)

    static关键字: package com.lbj.javase07; /*** "中国人"类* * 什么时候成员变量声明为实例变量呢?* -所有对象都有这个属性,但是这个属性的 ...

  9. Java SE 第二十三讲----static关键字and final关键字

    1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他 ...

最新文章

  1. 【疯狂积累CSS】2:利用@media screen实现网页布局的自适应
  2. python sanic 向别的服务器发送post请求_Sanic框架请求与响应实例分析
  3. spring BeanPostProcessor,BeanFactoryPostProcessor作用
  4. springboot集成mybatis源码分析(一)
  5. 《Advanced .NET Debugging》 读书笔记 Listing 3-2: 如何查看程序的PID
  6. Android——Ubuntu android NDK 配置
  7. SQL Server数据库--过滤数据
  8. C++中XML的读写操作(生成XML 解析XML)
  9. linux目录文件变化,Linux下监测目录或文件的变化---inotify
  10. linux的boot可用fat格式吗,u-boot中的FAT命令
  11. Atitit  Persistence API持久性标准化法总结 目录 1. 持久性对于大多数企业应用程序都非常要害 1 2. 持久化api内容 2 2.1. 一种声明式地执行O-R映射的方式。 2
  12. 员工端电脑重装系统或者更换电脑处理方法
  13. 诺基亚n8系统更新服务器模式,新年新版本 诺基亚N8最新固件PR1.1亮相
  14. 元胞自动机小团体matlab,元胞自动机matlab程序代码
  15. linux清除字体缓存,在 Windows,Mac和Linux上,如何安装,删除和管理字体
  16. java数学运算(Math类)
  17. 店盈通谈怎么提高店铺自然流量?
  18. Vivado出现编译错误:[USF-XSim 62] 'compile' step failed with error(s) while executing...
  19. 全面剖析雅虎助手以及网络实名的流氓行径(6)
  20. 终于明白马爹利蓝带和xo的区别了

热门文章

  1. 企业正确选择自动排产软件的目的
  2. 带文件名和行号的信息输出宏
  3. 录音切割开发php,录音截取软件(教程) 录音太长,想把它截成两段
  4. 编译官方DV300的SDKv2.0
  5. 离别信——CJ-麦科勒姆亲笔:致亲爱的波特兰
  6. Python 实现异或门逻辑
  7. 计算机图形学 图形变换
  8. VBA 校验身份证号
  9. DrugnomeAI: 靶标成药性预测模型
  10. ❀工信工实验参考——《VHDL实验4—— 多功能秒表》