<span>Java static , final和常量设计</span>
staic
static 是静态的,Java中特殊的关键字。
Java中的static关键字(可作用在)
1.变量 2.方法 3.类 4.匿名方法块
static 变量-个类的所有对象的共有成员变量。
- static变量只依赖于类存在(通过类既可以访问),不依赖于对象实例存在。即通过类名即可访问。
- 同一个类所有的对象实例,都共享存储在一个空间的静态变量。
静态变量在类中的作用如下:
1.静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增加实例之间的交互性。
2.如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而节省内存空间。例如,在类中定义一个静态常量 PI。
注意:在类中定义静态的属性(成员变量),在 main() 方法中可以直接访问,也可以通过类名访问,还可以通过类的实例对象来访问。
static 方法
- 静态方法也无需通过对象来引用,而通过类名可以直接访问。
- 在静态方法中,只能使用静态变量,不能使用非静态变量。
- 静态方法禁止使用非静态方法。
静态方法与实例方法的区别如下:
1.静态方法不需要通过它所属的类的任何实例就可以被调用,因此在静态方法中不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法。另外,和 this 关键字一样,super 关键字也与类的特定实例相关,所以在静态方法中也不能使用 super 关键字。
2.在实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法。
static块 - 只在类第一次被加载时调用。
- 换句话说,在程序运行期间,这段代码只运行一次。
- 执行顺序:static块 -> 匿名块 -> 构造函数。
总结:
-static变量:不管有多少个对象,内存中只有一份。
-static方法:可以用类名直接引用,无需用类名来引用。
-stacti块:只执行一次,并且static块 -> 匿名块 -> 构造函数。
注:不建议编写块代码,因为块代码会给程序带来混淆。建议将块代码封装成函数再调用。
单例模式
单例模式,又名单态模式,Singleton
限定某一个类在运行过程中,只能保留一个实例对象在内存里。
单例模式:
- 保证一个类有且只有一个对象。
- 采用static来共享对象实例
- 采用private构造函数,防止外界new操作。
总结:
- 设计模式:是经过验证的,用于某些场合的解决方案。
- GoF提出23种设计模式:创建型,结构型和行为型。
- 单例模式保证一个类在内存空间中只有一个对象。
final
Java中的final关键字同样可以用来修饰 1.类 2.方法 3.字段
final的类不能被继承
父类中如果有final的方法,子类中不能改写此方法。
final对象的指针固定了,因此因此只能修改对象内部的值,而不能指向一个新的对象(内存空间)。
final的变量,不能再次赋值。
- 如果是基本类型的变量,不能修改其值。
- 如果是对象实例,则不能修改其指针。(但是可以修改对象内部的值)
注意:注意:final 修饰的变量不能被赋值这种说法是错误的,严格的说法是,final 修饰的变量不可被改变,一旦获得了初始值,该 final 变量的值就不能被重新赋值。
总结:
1.final类:不能被继承
2.final方法:不能被子类改写
3.final变量:基本类型不能修改值,对象类型不能修改指针。