您的位置:首页 > 职场人生

黑马程序员-Java语言基础 –面向对象 第6天

2012-06-04 00:36 441 查看
---------------------- android培训java培训、期待与您交流!
----------------------


1、static(静态)关键字

用法:是一个修饰符,用于修饰成员(成员变量和成员函数)。

静态修饰内容被对象所共享。

当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用。

用法:类名.静态成员。

被修饰后的成员具备以下特点:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: