---------------------- android培训、java培训、期待与您交流! ----------------------
用法:是一个修饰符,用于修饰成员(成员变量和成员函数)。
静态修饰内容被对象所共享。
当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用。
用法:类名.静态成员。
被修饰后的成员具备以下特点:
1、随着类的加载而加载,随着类的消失而消失,所以生命周期最长。
2、优先于对象存在。明确一点,静态是先存在的,对象是后存在的。
3、被所有对象所共享。
4、可以直接被类名调用。(类名.静态成员)
实例变量(非静态成员变量)和类变量(静态成员变量)的区别:
1、存放位置
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中
2、生命周期
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
Static静态使用注意事项:
1、静态方法只能访问静态成员(方法、变量)。(非静态方法既可以访问静态,也可以访问非静态。)
2、静态方法中不可以写this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this。
3、主函数是静态的。
静态利与弊:
利:对对象的共享数据进行单独存储,节省空间;可直接类名调用。
弊:生命周期过长,访问出现局限性。即:静态虽好,只能访问静态。
主函数(main):public static void main(String[] args){ }
是一个特殊的函数,作为程序的入口,被JVM调用。
定义:
public:表示该函数的访问权限最大。
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体返回值。
main:不是关键字,但是一个特殊的单词,可以被JVM识别。
(String[] args):函数的参数,参数类型是一个字符串类型数组,其中args(变量名)代表arguments(参数),可以改。(可在运行时传入参数。例:java Demo args[0] args[1])
主函数格式固定,JVM在调用主函数时,传入的是newString[0];(一个长度为0的数组)
什么时候使用静态?
从两方面下手:(成员变量和成员函数)因为静态修饰的内容有成员变量和成员函数。
1、什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态修饰。
对象中的特有数据要定义成非静态存在于堆内存中。
2、什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象特有数据)时,就可以将该功能定义成静态的。
2、静态的应用[day06-05]
1、每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用。
2、每一个方法都没有用到对象中的特有数据,那么为了让程序更严谨,是不需要对象的,则将方法定义为静态的,直接通过类名调用,进一步为了不让该类能够建立对象,则将构造函数私有化。
3、将.class文件发送给他人,其他人只要将文件设置到classpath路径下,就可以使用该工具类,但对方不知道类中有什么方法,所以需要制作程序说明文档。
set classpath =.;c:\myclass //=.是先查找当前目录,再查找设置目录 |
文档注释
API-Application Programming Interface(应用程序接口)
public class 类名(类必须是公共的才能创建注释文档)
/**
这是一个可以对数组进行操作的工具类,该类中提供了,获取最值,排序等功能,
@author Lisa
@version V1.1
*/
通过javadoc -d myhelp -author -version ArrayTool.java命令生成文档,
再通过所生成的myhelp目录下的index.html浏览帮助文档。
(private和default函数不会在文档中显示,public和protected函数会显示)
注意:
一个类中参数的构造函数,系统自动加上的。这个默认的构造函数的权限和所属类一致。
如果类被public修饰,那么默认的构造函数也带public修饰符
如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
默认的构造函数的权限是随着类的变化而变化的。
3、静态代码块
格式
static
{
静态代码块中的执行语句。
}
特点:随着类的加载而执行,只执行一次,并优先于主函数。
作用:用于给类进行初始化(一个类进内存,不需要对象的情况下,类需要做些什么事情)。
比较:
构造代码块:给对象进行初始化。(对象一建立就运行,而且优先于构造函数运行。) 静态代码块:用于给类进行初始化 构造函数:给对应的对象初始化的。 |
类的加载:只有用到类的内容时才涉及类的加载问题。
例如:
StaticCode s = null;//不加载类
s = new StaticCode();//加载(默认空参构造函数)
StaticCode.show();//加载
4、对象的初始化过程
Person p = new Person("zhangsan",20);
这句话都做了什么事情?
1、因为new语句用到了Person.class,所以会先找到Person.class文件并加载到内存中。
2、执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3、在堆内存中开辟空间,分配内存地址。
4、在堆内存中建立对象的特有属性。并进行默认初始化。
5、对属性进行显示初始化。
6、对对象进行构造代码块初始化。
7、对对象进行对应的构造函数初始化。
8、将内存地址赋给栈内存中的p变量。
5、设计模式
解决某以问题最行之有效的方法。(Java23种设计模式[GOF])
单例设计模式:解决一个类在内存只存在一个对象。
想要保证对象唯一。
1、为了避免其他程序过多建立该类对象。先禁止其他其它程序建立该对象。
2、还为了让其他程序,可以访问到该类对象,只好在本类中自定义一个对象。
3、为了方便其他程序,对自定义对象的访问,可以对外提供一些访问方式。
这三步怎么用代码体现呢?
1、将构造函数私有化
2、在类中创建一个本类对象。
3、提供一个方法可以获取该对象。
对于事物该怎么描述,还是怎么描述。当需要将该事物的对象保证在内存中唯一时,就将以上三步骤加上即可。
单例设计模式的两种方式:
饿汉式:先初始化对象。Single类一进内存,就已经创建好了对象。(实际开发用饿汉式)
class Single { private Single(){}//私有化构造函数。 private static Single s = new Single();//(私有并静态对象)创建一个本类函数 静态方法,访问静态成员 public static Single getInstance()//提供一个方法可以获取该对象。(获取实例instance) { return s; } } |
懒汉式:对象是方法被调用时才初始化,也叫做对象的延迟加载。
Single类进内存时,对象还不存在,只有调用了getInstance方法时,才建立对象。
class Single { private Single(){} private static Single s = null; public static Single getInstance( ) { if(s==null) { s = new Single; } return s; } } | 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; } } |
懒汉式有可能出现线程不同步的安全问题。(解决方法:双重判断(上右模式))
记住原则,定义单例时,建议使用饿汉式。
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima