7.2 static关键字
7.2.1 static关键字含义
1. 为什么要使用static
有一些数据不必要隶属于每个对象, 例如Chinese类的country属性就应该是China,并且所有对象都应该是相同的, 这样的数据就可以声明成static的, 这样的数据就隶属于类, 通过类就可以直接访问, 当然通过对象也可以访问.
有一些方法也是相同的道理, 可以被static修饰, 这样的方法只需要通过类调用即可, 不需要创建对象.
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。 |
2. 使用了static后的变化
使用了static以后的数据不再是不确定的, 就像对象的创建就是不确定的(也可称之为动态), static是确定的, 和动态形成对比, 所以称之为静态.
3.使用范围:
在Java类中,可用static修饰属性、方法、代码块、内部类
4.被修饰后的成员具备以下特点:
- 随着类的加载而加载
- 优先于对象存在
- 修饰的成员,被所有对象所共享
- 访问权限允许时,可不创建对象,直接被类调用
7.2.2 static修饰属性
1. 类属性
public class Person { private int id; public static int total = 0; public Person() { total++; id = total; } } |
<<instanceOf>> |
<<instanceOf>> |
2. 类属性的存储
类属性保存在方法区的类信息数据区中
3. 类属性的使用
类属性可以直接通过类名使用
4. 静态属性的特点
因为隶属于类, 所以静态属性通常是共享数据
7.2.3 static 修饰方法
1. 类方法(class Method)
没有对象的实例时,可以用类名.方法名()的形式访问由static标记的类方法。
在static方法内部只能访问类的static属性,不能访问类的非static属性。
class Person {
private int id;
private static int total = 0;
public static int getTotalPerson() {
|
id++; //非法
return total;
}
public Person() {
total++;
id = total;
}
public static void main(String[] args) {
System.out.println("Number of total is " +Person.getTotalPerson());
//没有创建对象也可以访问静态方法
Person p1 = new Person();
System.out.println( "Number of total is "+ p1.getTotalPerson());
}
}
2. 类方法特点
类方法隶属于类, 不能在其中直接访问对象属性, 如果想要访问对象属性, 必须先创建对象, 通过对象再访问对象属性. 而在非静态方法中, 可以直接调用类方法.
7.2.4单例设计模式
设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索。
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
public class Single { //private的构造器,不能在类的外部创建该类的对象 private Single() {} //私有的,只能在类的内部访问, 并且在声明同时就创建唯一对象 private static Single onlyone = new Single(); //getSingle()为static,不用创建对象即可访问 public static Single getSingle() { return onlyone; } } public class TestSingle { public static void main(String args[]) { Single s1 = Single.getSingle(); //访问静态方法 Single s2 = Single.getSingle(); if (s1==s2){ System.out.println("s1 == s2!"); } } } |
单例(Singleton)设计模式-饿汉式 |
class Singleton { //1.将构造器私有化,保证在此类的外部,不能调用本类的构造器。 private Singleton(){ } //2.先声明类的引用 //4.也需要配合static的方法,用static修饰此类的引用。 private static Singleton instance = null; //3.设置公共的方法来访问类的实例 public static Singleton getInstance(){ // 3.1如果类的实例未创建,那些先要创建,然后返回给调用者:本类。因此,需要static 修饰。 if(instance == null){ instance = new Singleton(); } //3.2 若有了类的实例,直接返回给调用者。 return instance; } } |
单例(Singleton)设计模式-懒汉式 |
暂时懒汉式还存在线程安全问题,讲到多线程时,可修复 |
举例:java.lang.Runtime |
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。