现在的位置: 首页 > 综合 > 正文

黑马程序员——面向对象的学习(二)

2013年09月01日 ⁄ 综合 ⁄ 共 4030字 ⁄ 字号 评论关闭

------- android培训java培训、期待与您交流! ----------

8static的作用

static是一个修饰符,用于修饰成员(成员变量、成员函数),当成员被static修饰后,多了一种调用方法:类名.成员名

体现:多个对象存在相同的数据时用static修饰属性,存放在数据区(方法区)

一、static的特点:

1、随着类的加载而加载。

也就是说哦静态会随着类的加载而加载,随着类的消失而消失,说明它的生命周期最长

2、优先于对象存在

声明一点:静态是先存在的,对象是后存在的

3、被所有的对象共享

4、可以直接被类名所调用

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

1、存放位置:

类变量随着类的加载存在于方法区中。

实例变量随着对象的建立而存在于堆内存中。

2、生命周期:

类变量的生命周期最长,随着类的消失而消失

实例变量的生命周期随着对象的消失而消失。

三、静态使用注意事项:

1、静态方法只能访问静态成员。

非静态方法即可访问静态方法,也可以访问非静态方法

2、静态方法中不可以定义thissuper关键字

因为静态优先于对象存在,所以静态方法中不可以有this关键字

四、静态的利与弊:

利处:对对象共享数据进行单独的空间存储,节省空间,没有必要为每个对象中存储一份。可以直接被类名调用。

弊处:生命周期过长

     访问出现局限性(静态虽好,只能访问静态)。

实例如下(主函数):

五、对主函数进行分析:

publicstaticvoid
main(String[] args)

//主函数时一个特殊的静态函数,作为程序的入口,可以被jvm调用

主函数的定义:

public:代表着该函数的访问权限是最大的

static:代表着主函数随着类的加载就已经存在

void:主函数没有返回值

main:不是关键字,但是可以被jvm识别

(String args[]):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组

主函数时固定格式的:jvm识别

publicclass
CollectinDemo {

        publicstaticvoid
main(String[] args) {

                  Teacher teacher =
new Teacher("zhangfei",10);

                  teacher.teaching();

        }

}

public static void main(String args[])中只用args变量名可以改变(起源arguments

jvm在调用主函数时,传入的是new
String[0]

要理解javacjava的含义:

Javac启动编译器;java启动虚拟机

六、什么时候使用静态

要从两个方面下手:

因为静态修饰的内容有成员变量和成员方法

1、什么时候定义静态变量(类变量)呢?

当对象中出现共享数据时,该数据被静态所修饰;至于对象中的特有数据要定义成非静态,存放于堆内存中

2、什么时候定义静态方法(类方法)呢?

当功能内部没有访问到非静态的数据(对象的特有数据)时候,那么该功能可以定义成静态的

可以将这些功能抽取,独立封装,以便重复使用(示例如下):

publicclass
ArrayTool {

        publicstaticvoid
say(){

                  System.out.println("hello
world"
);

        }

        publicstaticvoid
study(){

                  System.out.println("I'm
study"
);

        }

}

9、工具类的生成

虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作,然而还是发现了问题:

1、对象适用于封装数据的,可ArrayTool对象并没有封装特有数据。

2、操作数组的每一个方法都没有用到ArrayTool对象的特有数据。

这个时候就考虑,让程序更严谨,是不需要建立对象的,可以把ArrayTool中方法都定义成static的。直接通过类名调用即可。

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

10、工具类的使用方式

【在使用工具非IDE工具的时候(或者直接在Dos环境下操作的时候),使用工具类步骤示例:set
classpath=.;c:\myclass       java  ArrayTool

被引用的类不在当前文件夹中,就要通过环境变量的设置来找到被引用的类,不然会抛异常,最好在设置的时候将“.;”当前目录带上,不然在运行的时候可能会报错

环境变量的设置:set classpath=.;c:\myclass(其中c:\myclass是一个文件夹的名称,这个可以任意)

如果使用的工具是集成的IDE工具,例如eclipseMyEclipseIntelliJ
IDEA 5.1
等,就不需要以上步骤。

给一个类写文档注释:

当这个类写好后,接下来,将ArrayTool.class文件发送给其他人,其他人只要将该文件设置到classpath路径下,就可以使用该工具类,但是该类中定义了多少个方法,使用者并不知晓,因为该类并没有使用说明书。

开始制作程序的文档说明书。Java的说明书通过文档注释来完成

示例代码如下:

ToolTest.java

/**

*这是一个可以对两个数进行比较的工具类

*@authorzhangzhongbao

*@version
v1.000

*/

publicclassToolTest

{

        /**

        *打印一段文字,内容为hhh

        */

        publicvoid
test(){

                  System.out.println("hhh");

        }

        /**获取两个比较数的最大值

        *@param
aint
变量用于比较的参数

        *@param
bint
变量用于比较的参数

        *@return返回最大值

        */

        publicint
getMax(
int a,int
b){

                
return a>b?a:b;

        }

}

如果一个类想要生成文档,那么这个类必须是public的,不然系统报错

创建帮助文档的步骤:

Javadoc -d myclass –author –version ToolTest.java(此方法可以生成和jdk文档一样的文档)

11、初识静态代码块

一、静态代码块格式:

static

{

      静态代码块中的执行语句

}

静态代码块特点:随着类的加载而加载,只执行一次,并且优先于主函数,用于给类进行初始化。

只执行一次,并且优先于主函数(这句非常重要),分析下面代码就能发现问题所在:a只执行了一次,示例代码:

publicclass
StaticCodeTest {

        static{

                  System.out.print("b
"
);

        }

        publicstaticvoid
main(String args[]){

                  new
StaticCode();

new StaticCode();//静态代码块在类加载的时候加载,而且只执行一次

                  System.out.println("over");

        }

        static{

                  System.out.print("c
"
);

        }

}

class
StaticCode{

        static{

                  System.out.print("a
"
);

        }

}

答案为b c
 a  over

12、静态代码块、构造代码快、构造方法的区别

静态代码块,随着类的加载而执行,且执行一次,优于主函数执行,用于给类进行初始化格式为:static{ }

构造代码块,用于给对象初始化,格式为:{ }

构造方法,用于创建相对应的对象

三者的执行顺序为:静态代码块>构造代码块>构造方法

示例代码:

publicclass
StaticCodeTest {

        static{

                  System.out.print("b
"
);

        }

        publicstaticvoid
main(String args[]){

                  newStaticCode(5);

                  newStaticCode(6);

                  System.out.println("over");

        }

        static{

                  System.out.print("c
"
);

        }

}

class
StaticCode{

        intnum
;

        static{

                  System.out.print("a
"
);//随着类的加载而加载,只执行一次

        }

        {

                  num=4;

                  System.out.println("构造代码块num"+num);//执行了两次,因为创建了两个对象

        }

        StaticCode(int
num){//
创建对象的时候执行,每创建一个对象,就执行一次

                  

抱歉!评论已关闭.