static 用法
静态:static
用法:作为修饰符,用于修饰成员(成员变量和函数)
被修饰以后不仅可以被对象调用而且也可以被类调用。类名.类静态成员
特点:1、随着类的加载而加载(当建立对象的时候,静态变量就会被加载进来,这时候静态变量就不会在堆内存而是在方法区),也就是随着类的存在而存在,生命周期长
2、优先于对象存在(静态是先存在,对象是后存在)
3、被所用对象共享(在方法区,节省内存)
4、可以直接被类调用
实例变量和类变量的区别:
1、类变量是存放在方法区
实例变量是存放在堆内存
2、类变量随着类的消失而消失
实例变量随着对象的消失而消失
静态使用注意事项:
1、静态方法只能访问静态成员
非静态方法既能访问静态也能访问非静态成员
2、 静态方法不能定义this、super关键字
因为静态优先对象存在,所以不能用this
3、主函数是静态
静态的利弊:
利:可以节省空间,可以被类调用
弊:生命周期长,访问出现局限性
什么时候使用静态变量
用从两方面入手(成员变量和函数)
什么时候使用静态变量?
当对象中的数据是共享的时候,用静态变量
什么时候使用静态函数
当功能内部没有非静态变量的时候,可使用静态函数
主函数的定义
1、Public: 是最大权限的访问
2、Static: 代表随着类的加载而加载
3、Void: 没有具体的返回值
4、Main: 是一个特殊的单词,供JVM识别
5、String[] args:是函数的参数,参数的类型是数组,数组中的元素字符串
6、主函数是固定格式,只有一个能改就是“args”
7、JVM调用函数的时候传入的参数是new String[0];
class StaticDemo
{
public static void main(String[] args)
{
Person ren=new Person();
ren.name="lilei";
ren.per();
//Person.per();出现错误以为“name”是非静态;
String[] arr={"haha","xixi","hehe"};
MaiTest.main(arr);//调用静态方法
}
}
class Person
{
String name;//成员变量,实例变量;
static String country="CN";//静态变量,类的变量
public void per()
{
System.out.println(name+"...."+country);
}
}
class MaiTest
{
public static void main(String[] args)
{
for(int i=0;i<args.length;i++)
System.out.println(args[i]);
}
}
静态的应用
//静态的应用-工具类
/*
将功能进行抽取、封装
建立一个ArrayTool对象使用这个工具
方法未使用特殊数据时,应用static
为了防止该类被其他程序建立对象,将该类的主函数私有化
*/
class ArrayTool
{
private ArrayTool(){};//私有化函数,不能建立对象
//取数组的最大值
public static int Max(int[] arr)
{
int max=0;
for(int i=1;i<arr.length;i++)
{
if(arr[max]<arr[i])
max=i;
}
return arr[max];
}
//取数组的最小值
public static int Min(int[] arr)
{
int min=0;
for(int i=1;i<arr.length;i++)
{
if(arr[min]>arr[i])
min=i;
}
return arr[min];
}
//选择排列
public static void seleftSolf(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);
}
}
}
//冒泡排列
public static void maoSolf(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-i-1;j++)
{
if(arr[j]>arr[j+1])
swap(arr,j,j+1);
}
}
}
//排序交换
private static void swap(int[] arr,int i,int j)
{
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
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.print(arr[i]+"]");
}
}
}
class ArrayToolDemo
{
public static void main(String[] args)
{
int[] arr={2,15,7,12,4};
int max =ArrayTool.Min(arr);
System.out.println("max="+max);
ArrayTool.printArray(arr);
ArrayTool.maoSolf(arr);
ArrayTool.printArray(arr);
}
}
制作文档帮助
/**
建立了一个对数组的工具类
@author 刘东康
@version V1.1
/**
获取数组中最大的值
@param arr 接受一个为int类型的数组
@return 会返回一个最大的值
*/
public static int Max(int[] arr)
{
int max=0;
for(int i=1;i<arr.length;i++)
{
if(arr[max]<arr[i])
max=i;
}
return arr[max];
}
静态代码块的特点
/**
静态代码块的特点:随着类的加载而执行,只执行一次,并优先于主函数,给类初始化
*/
class StaticCode
{
//静态代码块,给类初始化
static
{
System.out.println("a");
}
//构造代码块,给对象初始化
{
System.out.println("b");
}
//有参数的构造函数
StaticCod(int a)
{
}
} |