黑马程序员——static关键字 与简单的单态设计模式
2012-05-16 21:46
309 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
Static 静态成员变量
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
代码如下:
Static 静态方法
在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
静态方法不能以任何方式引用this和super关键字。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。
代码如下:
静态代码快
一个类中可以使用不包含在任何方法体中的静态代码块(static block ),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。
类中的静态代码块被自动执行,尽管我们产生了类的多个实例对象,但其中的静态代码块只被执行了一次。当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。
单例设计模式
所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
理解main方法的语法
由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。
---------------------- android培训、java培训、期待与您交流! ----------------------
Static 静态成员变量
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
代码如下:
class Chinese { static String country="中国"; String name; int age; void singOurCountry() { System.out.println("啊!,亲爱的" + country); //类中的成员方法也可以直接访问静态成员变量 } } class TestChinese { public Static void main(String [] args) { System.out.println("Chinese country is " + Chinese.country); //上面的程序代码直接使用了"类名.成员"的格式 Chinese ch1 = new Chinese(); System.out.println("Chines country is " + ch1.country); //上面的程序代码直接使用了"对象名.成员"的格式 ch1.singOurCountry(); } }
Static 静态方法
在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
静态方法不能以任何方式引用this和super关键字。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。
代码如下:
class Chinese { static String country="中国"; String name; int age; Static void singOurCountry() { System.out.println("啊!,亲爱的" + country); //类中的成员方法也可以直接访问静态成员变量 } } class TestChinese { public Static void main(String [] args) { System.out.println("Chinese country is " + Chinese.singOurCountry()); //上面的程序代码直接使用了"类名.成员方法"的格式 Chinese ch1 = new Chinese(); System.out.println("Chines country is " + ch1.singOurCountry()); //上面的程序代码直接使用了"对象名.成员方法"的格式 } }
静态代码快
一个类中可以使用不包含在任何方法体中的静态代码块(static block ),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。
类中的静态代码块被自动执行,尽管我们产生了类的多个实例对象,但其中的静态代码块只被执行了一次。当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。
class StaticCode { static String country; static { country = "china"; System.out.println("StaticCode is loading"); } } class TestStaticCode { static { System.out.println("TestStaticCode is loading"); } public static void main(String [] args) { System.out.println("begin executing main method"); new StaticCode(); new StaticCode(); } }
单例设计模式
所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
class Single { private static String name; private static int age; //首先要定义一个private的构造函数 private Single() { } //在类内部创建象一个static的对象 static Single single = new Single(); //定义一个静态的的方法供外部访问该类内部定义的对象 public static Single getInstance() { return single; } } public class TestSingle { public static void main(String[] args) { Single single1 = Single.getInstance(); Single single2 = Single.getInstance(); System.out.println(single1==single2);//结果为:true } }
理解main方法的语法
由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。
---------------------- android培训、java培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员——Java基础:static关键字、单例设计模式
- 黑马程序员-JAVASE入门( 面向对象、单例设计模式、this、static关键字)
- 黑马程序员——学习日志5面向对象(static关键字,单例设计模式,抽象类,接口)
- 黑马程序员 Java基础 面向对象:static关键字 main函数 单例设计模式
- Java知识碎片整理(5)——static关键字与单例设计模式
- java基础之equal()方法、static关键字、单例设计模式
- 设计模式简单学习(1)--深入浅出关键字---base和this
- 第十二讲 static关键字修饰属性和方法、代码块、单例设计模式、对象数组案例
- 黑马程序员_JAVA设计模式之简单工厂
- 黑马程序员_面向对象1_(封装、构造函数、this、static、单例设计模式)
- 黑马程序员—Java面向对象(单例设计模式、面向对象的继承、final关键字)
- 课时42|封装--static关键字、设计模式之单例模式
- Java笔记2 面向对象<2>static关键字、main函数、静态运用、单例设计模式
- JAVA main方法详解、单例设计模式、继承、关键字(static、extends、super、instanceof、final)
- 方法的重载与重写的关系(区别);static关键字;单例设计模式;继承;
- Java_static 关键字, 单例设计模式
- 【06】面对对象2_static关键字,单例设计模式
- 黑马程序员_Java基础_面向对象(Static的使用、对象初始化和调用成员过程、单例设计模式)
- 黑马程序员-Java _ 简单工厂设计模式(Plant Pattern)
- 黑马程序员-day06static关键字和静态,单例设计模式