java基础———第七天

关键字:static(静态)

概念:

static是一个修饰符,用于修饰成员(成员变量和成员函数)。当成员被静态修饰后,就多了一种调用方式:除了可以被对象调用外,还可以直接被类名调用。格式:类名.静态成员;

特点:

随着类的加载而加载,随着类的消失而消失。所以生命周期长。

优先对象存在,被所以对象共享,可被类名所调用。

注意:

静态方法只能访问静态成员,非静态成员即可以访问静态也可以访问非静态。

静态方法中不能定义this、super关键字。主函数是静态的。

利:节省空间,可被类直接调用。

弊:生命周期长,访问出现局限性。


实例变量和类变量的区别:

存在位置:

静态变量(类变量)随着类的加载而存在于方法区中,实例变量随着对象的建立而存在于堆内存中。

生命周期:

静态变量随着类的消失而消失,实例变量随着对象的消失而消失。、

所属范围:

静态属于整个类,被整个类所共享,实例变量时对象的特有数据,所属对象。


静态代码块

格式:static{

静态代码块执行的语句

  }

特点:

随着类的加载而加载,只执行一次并优先于主函数执行,用于给类进行初化。


静态代码块和构造代码块:

相同点:

都是jvm加载类时且在构造方法执行前执行,在类中科定义多个。

不同点:

静态代码块只在第一次new时执行一次,之后不再执行,而构造函数在每一次new一次就执行一次。

构造代码块可在普通方法中定义,而静态代码块不行。


局部代码块&构造代码块&静态代码块的作用及使用情况:

l1,局部代码块:
l作用:控制变量的生命周期;
l在程序中,当我们已经使用完x 后,并且在接下来的代码中,不会再用到x,那么就没必要让x 在内存中占用空间了,这用情况下,可以使用局部代码块,将x及其所设计到的区域封装为局部代码块,他们在程序执行中顺序不变,只是在执行完成后消失。
l2,构造代码块:
l作用:它可以给所有对象进行初始化
l存在于:类中。
l当类中的构造方法以重载的形式存在时,并且有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化;这样可以减少代码的重复!
l3,静态代码块:
l作用:给类进行初始化。
l当类中的方法都被静态了化,并且构造方法被private了,这时我们不能,在将这个类实例化,然而又想让类增加一些属性,就可以使用静态代码块

什么时候使用static?

成员变量所存储的数据,每个变量都拥有这个数据。此时就可以用static修饰该变量,让所有对象共享该数据。

成员函数没有访问对象的特有数据时,就可以将该方法定义成静态。因为该方法没有访问到对象的特有数据,所有我们再创建对象去调用方法是没必要的,将该方法修饰为静态后,可直接用类名调用。


静态的应用:

1.每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用

2.将方法都静态后,可方便于使用,但该类还可以被其他程序建立对象。为了使程序更加严谨,强制让该类不能建立对象,可通过将构造函数私有化实现。


设计模式

设计模式:解决某一类问题最行之有效的方法。共有23种。

单例设计模式:解决一个类在内存只存在一个对象。

饿汉式:

/*
单例设计模式之————饿汉式
	Single类一进内存,就已经创建好了对象。
*/

class Single{
	private int num;	
	private  Single(){}		//将构造函数私有化,防止创建对象
	private static Single s = new Single();

	//设置一个方法,返回创建的对象。
	public static  Single getInstance(){
		return s;
	}
	
	//设置一个方法,改变变量num的值。
	public void setNum(int num) {
		this.num = num;
	}

	//设置一个方法,返回改变后的num值。
	public int getNum() {
		return num;
	}
}

class SingleDemo {
	public static void main(String[] args) {
		Single s1 = Single.getInstance();
		Single s2 = Single.getInstance();

		s1.setNum(23);

		System.out.println(s2.getNum());
	}
}


懒汉式:

//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
class Single{
	private static Single s = null;
	private Single(){}
	public static Single getInstance(){
		if(s==null){
			synchronized(Single.class){				
				if(s==null)
					s = new Single();
			}
		}
		return s;
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章