java基础(五)——面向对象_静态
来源:互联网 发布:网络销售到底是传销吗 编辑:程序博客网 时间:2024/05/18 00:25
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,静态方法中不可以使用this,super关键字
因为静态优先于对象存在,所以金泰方法中不可以出现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]+", ");elseSystem.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
- java基础(五)——面向对象_静态
- Java基础<五>_面向对象(下)
- Java基础—面向对象(五)
- 五.Java基础_面向对象(三)
- 黑马程序员——java基础_面向对象
- 黑马程序员——java基础_面向对象
- 黑马程序员—java基础_面向对象2
- 黑马程序员—java基础_面向对象3
- JAVA基础五——面向对象一
- Java基础_面向对象_继承
- Java基础_面向对象_多态
- 面向对象_静态
- 面向对象_静态
- Java基础<五>---> 面向对象与类(匿名对象、构造函数、this、静态等)
- java基础—面向对象
- Java基础—面向对象
- Java基础_面向对象_类与对象、构造函数、关键字、静态代码块、单例
- Java基础视频教程第06天_面向对象之静态、单例设计
- Java基础(一)——关键字、变量、运算符
- Java基础(二)——流程控制、函数
- Java基础(三)——数组
- java基础(四)——面向对象_类、封装、构造器、this
- Spring事务管理
- java基础(五)——面向对象_静态
- C# list 用法
- 《白话Android的内部原理》的引子
- [JavaScript]多个表单中文件上传网址的获得的代码示例
- java基础(六)——面向对象_继承、抽象类、接口
- PySide信号槽
- 【phpcms-v9】规律技巧
- 浅谈八木天线的特点、原理与制作调整
- request对象分析及常用方法总结