Java修炼之凡界篇 筑基期 第06卷 面向对象 第05话 static关键字
static 关键字
在《Java编程思想》有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
简而言之,方便在没有创建对象的情况下来进行调用(方法/变量)
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问
static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能
static 修饰属性和方法
static方法一般称作静态方法
由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的
由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用
虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的
static变量也称作静态变量
静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,且只在类初次加载时会被初始化
非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
static成员变量的初始化顺序按照定义的顺序进行初始化
在Java中语法规定:static是不允许用来修饰局部变量的
程序案例:
public class Application {public static String staticStr = "100";public String str = "99";public static void main(String[] args) {Application application = new Application();System.out.println(Application.staticStr);System.out.println(application.staticStr);// System.out.println(Application1.str); // 编译报错System.out.println(application.str);application.staticRun();// run(); // 编译报错application.run();}public static void staticRun(){System.out.println(staticStr); // 静态方法中调用静态变量// System.out.println(str); // 静态方法中不能调用静态变量,编译报错System.out.println("这是静态方法staticRun");}public void run(){System.out.println(staticStr); // 非静态方法中调用静态变量System.out.println(str); // 非静态方法中调用非静态变量System.out.println("这是非静态方法run");}}
static 静态代码块
static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次
static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次
很多时候会将只需要初始化一次的程序使用静态块来进行
static 代码块可以出现在类中任何位置,并且可以是多个,只要不是方法内部
静态代码块在创建对象时,会被优先执行,优先级高于匿名代码块和构造方法
程序案例:
public class StaticChunk {{System.out.println("这是匿名代码块儿!!!!");}static {System.out.println("这是静态代码块儿!!!!");}public StaticChunk() {System.out.println("这是构造方法!!!!");}public static void main(String[] args) {System.out.println("=========第一次创建对象=========");StaticChunk staticChunk1 = new StaticChunk();System.out.println("=========第二次创建对象=========");StaticChunk staticChunk2 = new StaticChunk();// 由此可知静态代码块只会被执行一次} } // -------------------------------------- // 控制栏输出打印: /**这是静态代码块儿!!!!=========第一次创建对象=========这是匿名代码块儿!!!!这是构造方法!!!!=========第二次创建对象=========这是匿名代码块儿!!!!这是构造方法!!!!*/
static 静态导包
程序案例:
/** 不使用静态导包 */ public class StaticImport1 {public static void main(String[] args) {// 不导入包直接使用System.out.println(Math.random()); // 随机输出数字} }/** 使用静态导包 */ // 静态导入包且可以到方法 import static java.lang.Math.random; import static java.lang.Math.PI;public class StaticImport2 {public static void main(String[] args) {System.out.println(random()); // 输出 随机输出数字System.out.println(PI); // 输出 3.141592653589793} }
Java修炼之凡界篇 筑基期 第06卷 面向对象 第05话 static关键字相关推荐
- Java修炼之凡界篇 筑基期 第06卷 面向对象 第03话 构造器
构造器 构造器创建 类中构造器也被称为构造方法 程序案例: public class Application {public static void main(String[] args) {// n ...
- Java修炼之凡界篇 筑基期 第04卷 方法 第01话 什么是方法
什么是方法 什么是方法 方法是 Java 语言中程序语句的集合,它们在一起去执行某一项功能 方法是解决一类问题步骤的有序组合 方法包含在类或者对象中 方法在程序中被创建,在其他地方被引用(调用) 方法 ...
- Java修炼之凡界篇 筑基期 第02卷 语法 第03话 数据类型
数据类型 PS:平常生活中,也会用到一些数据的类型,例如:数字.字符(文字).是.非,且数字分为整数和小数,在Java中也是和生活中一样,有属于自己的数据类型,Java种有八大基本数据类型和一些引用类 ...
- Java修炼之凡界篇 筑基期 第01卷 入门 第04话 JDK JRE JVM
JDK JRE JVM JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK), 在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里 ...
- Java修炼之凡界篇 筑基期 第02卷 语法 第04话 类型转换
类型转换 Java是强类型语言,在进行有些运算时,需要用到类型转换 低----------------------->--------------------------->高 byte, ...
- Java修炼之凡界篇 筑基期 第02卷 语法 第01话 注释
注释 平时编写程序代码时,代码量在很少的时候,还能够记得和看懂自己写的程序,但是项目结构复杂并且时间长了之后,我们不一定会都记得,这个时候呢就需要用到程序的注释了 注释不会被程序所执行,是供编程的人员 ...
- Java修炼之凡界篇 筑基期 第02卷 语法 第06话 运算符
运算符 Java语言支持的运算符: 算术运算符:+, -, *, /, %, ++, – 赋值运算符:= 关系运算符:>, <, >=, <=, ==, !=, instanc ...
- Java修炼之凡界篇 筑基期 第03卷 流程控制 第04话 循环结构
循环结构 while 循环 语法结构: while (布尔表达式) {// 循环体(循环内容) } while 循环是最基本的循环 布尔表达式为 true,循环就会一直执行 程序中大多数情况,是需要程 ...
- Java修炼之凡界篇 筑基期 第03卷 流程控制 第03话 选择结构
选择结构 Java中选择结构多样,包含 if 单选择结构.if 双选择结构.if 多选择结构.嵌套的 if 结构和 switch 多选择结构 if 单选择结构 语法结构: if (布尔表达式) {// ...
最新文章
- JS 总结之事件循环
- 如何用两个小时入门 Docker?
- 基于改进的点对特征的6D位姿估计
- struct sockaddr与struct sockaddr in struct sockaddr un的区别和联系
- 多线程 java 实例_Java多线程实例学习
- python操作redis实例_Java,php,Python连接并操作redis实例
- 剑指Offer - 面试题57. 和为s的两个数字(双指针)
- 仿QQ聊天室【方案】
- 小米浏览器禁止java,如何禁止小米手机浏览器中弹出窗口广告
- 下载laravel框架
- MICROSOFT REPORTVIEWER(微软报表)项目中的应用
- matlab自适应滤波,基于MATLAB与DSP的自适应滤波器设计与实现
- Java 前后端分离部署方式
- 上海地铁三号线(轻轨明珠线)各车站换乘和时刻表
- Python+Opencv识别视频统计人数
- MATLAB图形的实验原理,信息隐藏实验1
- 凭实力讲,运维工程师能不能做成预言家?
- uni-app使用canvas将两张图片合成一张图片
- 【思维进阶】如果回到十年前你会做哪些事情?
- 我对计算机专业的认识及期望
热门文章
- 闲鱼买的显卡用什么软件测试,二手折腾记 篇三:我从闲鱼上买到了一张不存在的显卡,RX 5900XT 拆解评测...
- 瑞星2008免费版下载
- 华联、联华、世纪华联、百联
- java2d游戏引擎_2 - Java2D+3D游戏王(Yo-Gi-Oh!)开发日志_Linux编程_Linux公社-Linux系统门户网站...
- java netbeans 控制台乱码_netbeans 中文乱码问题
- dataTable自定义搜索框位置
- 驱动2-Linux设备模块
- Android Studio 运行HyperLPR开源项目安卓APP
- centos安装部署Swarm Bee V0.5.3教程
- 前端知识之angular组件库之NG-ZORRO-ANTD结构窥探(三)pipe ,polify,service