您的位置:首页 > 编程语言 > Java开发

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

2016-11-15 09:24 267 查看

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的所有方法都是静态方法

静态初始化块

静态块用于类的初始化,在类的初始化阶段执行

类获得初始化之后,静态块将永远不会获得执行的机会

关于静态块、非静态块、构造方法的执行顺序,参见:0023 Java学习笔记-面向对象-初始化代码块

单例类

什么是单例类:

这个类从始至终最多只能创建一个实例

何时用:

不允许自由创建该类对象,只允许创建一个对象的场景

比如:可能只能有一个窗口管理器;一个数据库引擎访问点

如何设计该类:

将该类的所有构造器用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: