• 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类


    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
  • 相关阅读:
    单选按钮控件(Ridio Button)的使用
    带属性页的对话框
    异常处理与MiniDump详解(4) MiniDump
    单片机与嵌入式 以及ARM DSP FPGA 几个概念的理解
    VC更换图标文件
    http://user.qzone.qq.com/2413264738/2
    安装包安装 执行有相对路径的程序不能正确运行
    如何将 jar 包导入Maven 本地仓库
    19、访问者设计模式
    11、装饰器模式
  • 原文地址:https://www.cnblogs.com/sonng/p/6064405.html
Copyright © 2020-2023  润新知