java0601 static 静态

来源:互联网 发布:mac excel公式 编辑:程序博客网 时间:2024/06/06 06:50
3.6STATIC 关键字

static关键字:
用法:用于修饰成员:成员变量和成员函数。static不在堆内存中
被修饰后的成员有以下特点:
随着类的加载而加载。
优先于对象存在。
被所有对象共享。
可以直接被类名调用。使用方法:类名.静态成员

使用注意:
静态方法只能访问静态成员。

如,国籍是共享的,而年龄、姓名是特有的。
特有内容随着对象存储于对内存中,而静态static在方法区中。(又称共享区,数据区)
主函数是静态的。

class MainDemo{
public statci void main(String[] args)
{
System.out.println("hello world!");
}
}

主函数:是一个特殊的函数,是程序的入口,可被jvm调用。
public:代表该函数访问权限是最大的。
static:代表主函数随着类的加载而存在。
void:无返回值。
main:不是关键字。但是是特殊保留单词,可以被jvm识别。
参数String[] Args:主函数的参数,数组型。该数组中的元素是字符串。

通过参数不同可以对主函数进行重载。
jvm只会调用特定格式的主函数。
主函数是格式固定的,虚拟机识别。
------------------------------------------------------------------------
什么时候使用静态?

要从两方面下手:
因为静态锈蚀的内容可以有 成员变量和函数。

当对象中有共享数据时候,该数据被静态锈蚀。
对象中特有的数据定义为非晶态存在于堆内存中的(对象内部)

什么时候定义静态函数?

首先,静态函数只能访问静态。当功能内部没有访问到非静态数据(对象的特有数据),
那么该功能可定义为静态的。
class Person
{
String name;
public void show(){
S.O.P("haha");
}
}

这个方法没访问非静态内部数据(特有数据)。

如果方法没有访问到内部特有数据,直接用类名调用即可方便使用,不用创建类之后再调用。

--------------------------------------------------------------------------------------------------
静态的应用。
早前写法与现状写法。

class Demo
{
public static void main(String[] args)
{
int[] arr = [3,4,1,8];

int max = getMax(arr);
S.O.P("max"+arr[max]);
}
}

为了方便复用,我们封装成函数。
public static void getMax(int[] arr){
int max = 0;
for(int x=1; x
{
if(arr[x] >arr[max])
max = x;
}
return arr[max];
}

如果另一个程序中也用到了getMax方法,那么可以把这个方法封装成类,在多个程序中使用。
也就是说,共性的功能可以剥离并封装,以便复用。

class ArrayTool{
public static void getMax(int[]arr){
int max = 0;
for(int x=1; x
{
if(arr[x] >arr[max])
max = x;
}
return arr[max];
}

public int getMin(int[] arr){
int min = 0;
for(int x=1; x
{
if(arr[x]
min = x;
}
return arr[min];
}
public void selectSort(int[]arr)
{
for(int x=0; x< arr.length - 1;x ++)
{
for(int y = x +1; y
{
if(arr[x] > arr[y])
{
swap(arr,y,y + 1);
}
}
}
}

public void bubbleSort(int[]arr)
{
for(int x = 0; x < arr.length -1; x ++)
{
if(arr[y] > arr[y +1]
{
swap(arr,y,y + 1);
}
}
}
}

封装好之后,如果想要使用,先编译工具类生成class文件,再编译调用类。

如果反过来,它会自动编译内容包含的其他类(path下和当前目录下)的class文件。没有运行文件,会自动寻找java文件。

如果没有class也没有java,会提示 找不到符号。
-----------------------------------------------------------------------------------------------------
 帮助文档 的制作

进行路径设置的时候如果忘记打. set classpath=.;c:\myclass
这样就可以了。

对于别人发来的class文件,需要说明书来了解其详细功能。java的说明书通过文档注释来完成。


写好之后,可以使用javadoc工具。
使用方法:javadoc -d myhelp 
-d:directory -author -version ArrayTool.java

如果ArrayTool类没有被public封装,那么无法建立(权限不够)

一个类中默认会有一个空参数够赞函数。
这个默认的构造函数的权限和所属的类一致。
如果类被public修饰,那么磨人的够赞函数也带public修饰符,
如果没有,那么磨人的构造函数也没有public修饰。

空参数 构造函数和默认构造函数是两个概念。

-------------------------------------------------------------------------------------------------
静态代码块
static{
静态代码块中的语句
}


class StaticCode{
static 
{
System.out.println("a");
}
}
特点:随着类的加载而执行,只执行一次。
用于为类进行初始化(如果没有对象初始化,可以用这个进行初始化。)

非得建立对象,类才会被加载么?
不是。调用静态方法时也会执行类中的静态代码块。

考试的时候考什么?
静态代码块、构造代码块、构造函数哪个先加载。
静态->构造代码块->构造函数。
--------------------------------------------------------------------------------------------------------------
对象与内存。

Person p = new Person();

1.因为new用到了person。class 文件,所以会先找到person。class文件并加载到内存中。
2.会执行该类中的static代码块(如果有的话),给Person.class类进行初始化。
3.在堆内存中开辟 空间,分配内存地址。
4.在堆内存中建立对象的特有属性,并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址赋给内存中的p变量。

0 0