Java开发中static关键字使用
一、static
static是静态的,可以修饰属性、方法、代码块、内部类
二、静态属性
被static修饰的属性叫静态属性(类变量),static修饰的变量,不属于某一个类,是共享的。不需要new对象就能调用。
1、属性根据是否使用static修饰,分为静态变量和实例变量
静态变量:
创建多个类,多个对象共享同一个静态变量。修改其中一个对象的静态属性时,会导致其他对象的同样的属性值被修改。
实例变量:
创建多个类,修改其中一个对象的非静态属性时,不会导致其他对象中的同样的属性值修改
2、其他说明
①. 静态变量随着类的加载而加载。可以通过“类.静态变量”的方式调用
②. 静态变量的加载早于对象的创建
③. 类只会加载一次,静态变量在内存中也只会加载一次
④. 调用方式
类变量 | 实例变量 | |
---|---|---|
类 | Y | N |
对象 | Y | Y |
3、静态属性举例:
System.out、 Math.PI(静态常量);
4、内存分布:
栈:局部变量
堆:new出来的结构:对象、数组
方法区:类的加载信息、静态域、常量池
5、开发中,如何确定一个属性是否要声明为static的?
属性可以被多个对象共享,不会随着对象不同而不同的。
类中的常量也常声明为static
三、静态方法
被static修饰的方法是静态方法。
1、方法根据是否使用static修饰,分为 静态方法和非静态方法
静态方法
①、静态方法中,只能调用静态的方法或属性。(在静态方法中,不能使用this关键字,super关键字)
②、静态方法随着类的加载而加载。可以通过“类.静态方法”的方式调用
非静态方法
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
2、其他说明
①在静态方法中,不能使用this关键字,super关键字
②关于静态属性和方法的使用,从生命周期的角度理解
③调用方式
静态方法 | 非静态方法 | |
---|---|---|
类 | Y | N |
对象 | Y | Y |
3、开发中,如何确定一个方法是否要声明为static的?
操作静态属性的方法,通常设置为静态方法
工具类中的方法,习惯上声明为静态方法。如:Math、Arrays、Collections
4、代码块
代码块的作用:用来初始化类、对象
1、代码块根据是否使用static修饰,分为 静态代码块和非静态代码块
a、静态代码块
-
静态代码块执行优先级高于非静态的初始化块,在类初始化的时候执行一次,执行完成便销毁,仅能初始化类变量
-
内部可以有输出语句
-
静态代码块(初始化块)随着类的加载而加载。而且只执行一次
-
初始化类的信息
-
一个类可以有多个静态代码块,按照声明的先后顺序执行
-
静态代码块执行优先于非静态代码块
-
静态代码块不能调用非静态的属性和方法
b、非静态代码块
-
非静态代码块,执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行
-
内部可以有输出语句
-
随着对象的创建而执行,没创建一个对象执行一次
-
创建对象时,对对象的属性等进行初始化
-
一个类可以有多个非静态代码块,按照声明的先后顺序执行
-
非静态代码块执行后于静态代码块
-
非静态代码块可以调用静态属性和方法
2、静态代码块的执行顺序:
静态代码块----->非静态代码块-------->构造函数
5、内部类
1、内部类分类
Java允许将类A声明在类B中,类A就是内部类,类B为外部类
成员内部类
①作为外部类的成员: 可以调用外部类的结构
可以用static修饰(外部类不能用static修饰)
可以被4种不同的权限修饰
②作为类:类内可以定义属性。方法、构造器、内部类等,可以继承;
可以被final修饰,表示此类不能被继承/不被final修饰,就可以继承;
可以被abstract修饰,表示类不能被实例化。
成员内部类根据是否使用static修饰,分为:
静态内部类,不能调用外部非静态的属性、方法
局部内部类
方法内、代码块内、构造器内
2、内部类需要关注的问题:
①如何实例化成员内部类的对象
静态内部类:new 外部类.内部类();
非静态内部类:外部类 a=new 外部类();
a.new 内部类();
② 如何在成员内部类中区分调用外部类的结构
形参:直接调用;
内部类:this.调用
外部类:外部类.this.调用
③开发中局部内部类怎么使用 :
④源码应用:Thread(枚举内部类表示状态的)、Integer(用来缓存的内部类IntegerCache)
⑤局部内部类注意点:
局部内部类的方法中,如果调用局部内部类声明的方法中的局部变量时,要求此变量必须是fianl的。
JDK1.7之前此局部变量必须声明为final的;JDK8之后可以省略。
以上内容仅为自己学习整理,帮助自己学习的同时,希望帮助到有需要的人。
本文地址:https://blog.csdn.net/weixin_41309817/article/details/108256425
上一篇: springIOC容器依赖注入的原理解析
下一篇: 使用Lambda表达式与普通方法的区别
推荐阅读
-
浅谈Android注解在日常开发中的简单使用
-
Java开发项目实例中的技术总结
-
Java开发中的23种设计模式详解
-
java8中使用java.util.Base64报“java.lang.IllegalArgumentException: Illegal base64 character d”
-
初学:在PHP网站开发中如何使用cookies?
-
php类中的$this,static,final,const,self这几个关键字使用方法_php实例
-
java-使用war将spring-boot和angular 7应用程序部署到tomcat 8.5中
-
JQuery编程开发中extend使用方法介绍
-
java中Memcached的使用实例(包括与Spring整合)
-
java微信开发(wechat4j)——access_token中控服务器实现