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

java基础(五)——面向对象_静态

2017年11月05日 ⁄ 综合 ⁄ 共 4093字 ⁄ 字号 评论关闭

 

1,静态:static

1.1用法:是一个修饰符,用于修饰成员(成员变量和成员方法),当成员变量被静态修饰后,除了可以被“对象成员变量”调用外,还多了一种修饰方法:类名.成员变量

 

1.2static的特点:

1.2.1.随着类的加载而加载;

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

1.2.2.优先于对象存在;

              明确一点:静态先存在,对象后存在

1.2.3.被所有对象共享;

1.2.4.可以直接被类名所调用;

 

1.3静态变量和类变量的区别:

1.3.1,存放的位置:

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

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

1.3.2,生命周期:

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

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

 

1.4静态使用注意事项:

1.4.1,静态方法只能访问静态成员

              非静态既可以访问静态也可以访问非静态

1.4.2,静态方法中不可以使用thissuper关键字

              因为静态优先于对象存在,所以金泰方法中不可以出现this

1.4.3,主函数是静态

 

1.5,静态的利与弊:

利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要为每个对象都存储一份。

     可以被类名直接调用。

弊端:生命周期过长。

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

示例代码:

class Person
{
	String name;                   //成员变量,实例变量
	static String country="CN";    //静态的成员变量,类变量
	public static void show()
	{
			System.out.println(": :"+country);
	}
}

class StaticDemo 
{
	public static void main(String[] args) 
	{
			//Person p=new Person();
			//p.name="zhangsan";
			//p.show();
			Person.show();    //直接使用类型调用
	}
}

1.6,什么时候使用静态?

1.6.1,什么时候定义静态变量(类变量)?

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

1.6.2,什么时候定义静态函数?

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

 

2,静态的应用:

  每个应用程序都有一个共性的功能,可以将这些功能进行抽取,独立封装,以便复用。

下面给出一个示例,该示例演绎的是自定义操作数组的工具类,工具类中实现了数组的取最值、选择排序、冒泡排序和打印等功能。

ArrayTool是用户自定义的工具类,ArrayTest是用户测试类。

class ArrayTool:

/**
这是一个对数组进行操作的类,类中提供了获取最大值最小值和排序等功能!
@author 李超
@version V1.0
*/
public class ArrayTool 
{
	/**
	空构造函数
	*/
	private ArrayTool(){}
	/**
	获取一个整型数组的最大值
	@param arr 接收一个int类型的数组
	@return        会返回数组中的最大值
	*/
	public static int getMax(int[] arr)
	{
		int max=0;
		for(int i=1;i<arr.length;i++)
		{
		if(arr[i]>arr[max])
		max=i;
		}
		return arr[max];
	}
	/**
	获取一个整型数组的最小值
	@param arr 接收一个int类型的数组
	@return        会返回数组中的最小值
	*/
	public static int getMin(int[] arr)
	{
		int min=0;
		for(int i=1;i<arr.length;i++)
		{
			if(arr[i]<arr[min])
			min=i;
		}
		return arr[min];
	}
	/**
	给int数组进行选择排序
	@param arr 接收一个int类型的数组
	*/
	public static void selectionSort(int[] arr)
	{
		for(int i=0;i<arr.length-1;i++)
		{
			for(int j=i+1;j<arr.length;j++)
			{
				if(arr[i]>arr[j])
				{
					swap(arr,i,j);    
				}
			}
		}
	}
	/**
	给int数组进行冒泡排序
	@param arr 接收一个int类型的数组
	*/
	public static void bubbleSort(int[] arr)
	{
		for(int i=0;i<arr.length-1;i++)
		{
			for(int j=i+1;j<arr.length-i-1;j++)
			{
				if(arr[j]>arr[j+1])
				{
					 swap(arr,j,j+1);
				}
			}
		}
	}
	/**
	给数组中的元素进行位置置换
	@param arr 接收一个int类型的数组
	@param a 要置换的位置
	@param b 要置换的位置
	*/
	private static void swap(int[] arr,int a,int b)
	{
		int temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;
	}
	/**
	用于打印数组中的元素,格式是:[element1,element2,...]
	*/
	public static void printArray(int[] arr)
	{
		System.out.print("[ ");
		for(int i=0;i<arr.length;i++)
		{
			if(i!=arr.length-1)
			System.out.print(arr[i]+", ");
			else
			System.out.println(arr[i]+"]");
		}
	}
}

class ArrayTest:

class ArrayTest 
{
	public static void main(String[] args) 
	{
		int[] arr={3,5,6,2,4,1,0,8,7};
		 
		int max=ArrayTool.getMax(arr);
		System.out.println("max="+max);
		ArrayTool.printArray(arr);
		ArrayTool.selectionSort(arr);
		ArrayTool.printArray(arr);
		/*
		ArrayTool at=new ArrayTool();   //此处报错,因为ArrayTool类的构造函数被private修饰,外部类不能调用对象访问
		int max=at.getMax(arr);
		System.out.println("max="+max);
		*/
	}
} 

3,帮助文档的制作(javadoc)

制作程序说明书,java的说明书是通过文档注释来完成的,具体注释方法参考上面的源代码。

》》》文档注释以“/**”开始,以“*/”标志结束,相应的信息和批注所对应的位置很重要! 类的说明应在类定义之前,方法的说明应在方法的定义之前。

》》》批注参数来标记一些特殊的属性及其相应的说明 。

— @author<作者姓名>

— @version<版本信息>

—     @param<参数名称><参数说明>

—     @return<返回值说明>

dos命令是:javadoc -d myclass -author -version ArrayTool.java

注意:-d说明生成文档存放的路径,可以指定绝对路径,如c:\myclass;可以指定相对路径,如myclass,会自动生成一个myclass文件夹

            -author,-version显示作者和版本号,可加可不加

                     后跟类的名称

                     但是,所被生成说明的类必须是公共类,类名前加public,否则生成文档会报错

编译结果:

 最终文档:

 4,静态代码块

格式:

static

{

       静态代码块中的执行语句

}

特点:随着类的加载而执行,只执行一次。用于给类进行初始化的。

 

示例代码:

class StaticCode
{
	static
	{
		System.out.println("a");
	}
}
class StaticCodeDemo 
{
	static
	{
		System.out.println("b");
	}
	public static void main(String[] args) 
	{
		new StaticCode();
		new StaticCode();
		System.out.println("over");
	}
	static
	{
		System.out.println("c");
	}
}

运行结果:

        分析:首先StaticCodeDemo类加载到内存,静态代码块随着类的加载而加载,所以StaticCodeDemo类中的第一个静态代码块执行,打印b

接着执行第二个静态代码块,打印c;再接着执行main方法,执行到new StaticCode();时,StaticCode类被加载,StaticCode类中的静态代码块执行,

打印a;当执行到第二个new StaticCode();时,静态代码块值加载一次,不会再加载,所以什么都不打印,最好执行main的打印语句,打印over

 

总结:关于静态的知识点不难理解,但是又常常在静态这里犯错,主要是因为没有清楚的了解JVM的运作机制,不了解静态合适呗加载进内存,

何时存在何时消亡。有了上面的知识清单,就更好掌握静态的应用了,铭记:静态成员是随着类的加载而加载的,在对象创建之前静态成员就已经存在内存中,

所以关于静态中不能访问非静态这个异常就很好理解了,以后该知道怎么去处理这些异常。

    本知识清单还列处理Java文档的制作,Java文档时给程序做一些说明用的,方便于以后为源码进行升级和维护,好的程序员会知道在编程时加上注释,

编译成文档,这使得代码更具有可读性。关于java文档的制作,上面的示例代码有一些介绍,可以作为必要的掌握!

2013.03.17

抱歉!评论已关闭.