static可以修饰哪些成员

  • 成员变量---可以修饰
  • 构造方法---不可以
  • 方法---可以修饰
  • 初始化块---可以修饰
  • 内部类(包括接口、枚举)---可以修饰
  • 总的来说:静态成员不能访问非静态成员

静态变量

  • static修饰的变量为静态变量
  • 在创建对象时,静态变量位于方法区中,而非像实例变量一样,位于堆内存中
  • 一个类的所有对象共用相同静态变量,通过类名来调用静态变量,通过实例来调用虽然也符合语法,但不推荐
  • 示例:静态变量的一个用法
class Employee{
private static int nextId=1;
private int id;
public void setId{
id=nextId;
nextId++;
}
}
Employee harry=new Employee();
harry.setId();

静态常量

  • 静态变量上再加个final修饰,则为静态常量
  • 比如,Math类的的E和PI
    public final class Math {
private Math() {}
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
.
.
.
}
  • 一般不要把实例变量设计为public,而是再写个set和get方法,但final修饰的变量却没关系,可以设置为public

静态方法

  • static修饰方法
  • 静态方法不能操作对象,因而不能调用实例变量,只能访问到静态变量
  • 静态方法相当于没有this隐式参数的传递
  • 通过类名调用方法,比如:Math.pow(x,a);通过对象调用静态方法,是符合语法规则的,但是不推荐
  • 即使某个类型的引用为null,但也可以调用静态方法
  • 什么时候用静态方法:
    • 一个方法不需要访问对象的状态,所需的参数都通过方法签名(显式参数)传入
    • 一个方法只需要访问静态变量
  • 静态方法示例:
    • java.lang.Math的所有方法都是静态方法

静态初始化块

单例类

  • 什么是单例类:

    • 这个类从始至终最多只能创建一个实例
  • 何时用:
    • 不允许自由创建该类对象,只允许创建一个对象的场景
    • 比如:可能只能有一个窗口管理器;一个数据库引擎访问点
  • 如何设计该类:
    • 将该类的所有构造器用private修饰,外部就不能用构造器随意构造实例了
    • 提供一个public方法作为访问点,用来创建那么一个实例,但要用static修饰,因为调用该方法之前还不存在对象,只能通过类名调用类方法
    • 再创建一个static变量来保存这个唯一的实例
  • 示例代码:
public class T1{
public static void main(String[] args) {
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println("s1和s2是否指向同一个对象: "+(s1==s2));
}
}
class Singleton{
private static Singleton instance; // 3. 用private static变量保存唯一的实例
private Singleton(){} //1. 用private修饰构造方法
public static Singleton getInstance(){ //2. 提供一个public static方法返回实例
if (instance==null){
instance=new Singleton(); //方法体保证最多只有一个实例
}
return instance;
}
}

其他

  • 非静态方法,相当于有显式和隐式两个参数

    • 显式参数:从方法签名中传入的
    • 隐式参数:对象调用方法时,传入的this

最新文章

  1. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
  2. [Animatable Properties](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/AnimatableProperties/AnimatableProperties.html)
  3. 03-Swift常量&变量
  4. oracle创建视图
  5. NuGet学习笔记1——初识NuGet及快速安装使用
  6. NGUI Label Color Code
  7. rpm安装rpm-package报错:Header signature NOKEY 和 error: Failed dependencies:
  8. ios 聊天demo 和nsoperationdemo
  9. 翻译Android USB HOST API
  10. 使用 HTMLTestRunner.py
  11. CentOS中安装Python-PIP
  12. 【vue】iView-admin2.0动态菜单路由
  13. 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge 通知和 Tile 通知发送到锁屏
  14. springboot11-security02FromDB 权限管理(用户信息和角色信息保存在数据库)
  15. JVM学习笔记(三):类文件结构
  16. ubuntu 磁盘分区
  17. Linux(Contos7.5)环境搭建之Linux远程登录(一)
  18. Redis 小结
  19. 简单的 ajax demo
  20. Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec: 0x01030200

热门文章

  1. PHP中利用GD实现的柱状图
  2. RPM Version Comparison
  3. Eclipse保存文件时自动格式化代码
  4. Scalaz(0) - 写在前面
  5. [moka同学笔记]Yii2.0 modal的使用
  6. CentOS 6.5/6.6 安装(install)mysql 5.7 最完整版教程
  7. HTML5+Activex+Singr+ABP+MongoDB
  8. C#操作Excel的函数
  9. 我所知道的Javascript
  10. Soundslice – 美妙乐谱!Web 技术高大上的应用