------- android培训、java培训、java学习型技术博客、期待与您交流! ----------
知识点
(来自百度百科)有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main()。因为在程序开始执行时必须调用main() ,所以它被声明为static。
声明为static的变量称为静态变量或类变量。可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。
声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。静态方法不能被子类的静态方法覆盖。
声明为static的变量称为静态变量或类变量。可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。
声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。静态方法不能被子类的静态方法覆盖。
01)static静态关键字
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
p.show();
System.out.println(p.country);//通过引用调用。
System.out.println(Person.country);//通过类名直接调用
}
}
class Person{
String name;//成员变量,实例变量。
static String country = "CH";//静态变量。被static修饰的属性在方法区(共享区、数据区)被创建。被所有创建的对象所共享。
void show(){
System.out.println(name + "的国籍是:" + country);
}
}
运行结果如下图所示:
02)main函数
public class MainDemo {
public static void main(String[] args) {//参数args是可以更改的。arsg、ag、xx都可以。【args】只是一种习惯。
String[] arr = {"hah", "huohuo", "heh", "hihi", "hiahia"};
MainTest.main(arr);//通过类之间调用静态方法(main)。
}
}
class MainTest{
public static void main(String[] args) {
System.out.println("一共有"+ args.length + "个元素,分别是:");
for (int i = 0; i < args.length; i++){
System.out.print(args[i] + " ");
}
}
}
运行结果如下图所示:
03)何时使用静态?(static)
要从两方面考虑:因为静态修饰的内容有成员变量和函数(方法)。
如果想让一个类的所有实例共享数据,就要使用静态变量(类变量)。(
对象中的特有数据要定义成非静态存在堆内存中。)
什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
public class PersonDemo_2 {
public static void main(String[] args) {
// Person_2 p = new Person_2();
// p.show();//如果只是调用show()方法,楼上的创建对象将变的无意义。
Person_2.show();//直接通过类名调用。
}
}
class Person_2{
String name;
public static void show(){//因为方法不访问name变量,所以需要修饰为static。
System.out.println("Welcome to Java!");
}
}
运行结果如下图所示:
04)静态的应用——工具类
代码:
首先创建工具类:ArrayTool。
然后创建测试类:ArrayToolDemo。运行。
public class ArrayTool {//工具类
private ArrayTool(){}//私有化。
public static int getMax(int[] arr){//获取最大值。
int max = arr[0];
for (int i = 1; i < arr.length; i++){
if (arr[i] > max)
max = arr[i];
}
return max;
}
public static int getMin(int[] arr){//获取最小值。
int min = arr[0];
for (int i = 1; i < arr.length; i++){
if (arr[i] < min)
min = arr[i];
}
return min;
}
public static void selectSort(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 bubbleSort(int[] arr){//冒泡排序:降序。
for (int i = arr.length - 1; i > 0 ; i--){
for (int j = i - 1; j > -1 ; j--){
if (arr[i] > arr[j])
swap(arr, i, j);
}
}
}
private static void swap(int[] arr, int a, int b){//位置置换。
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
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] + "]");
}
}
}
创建测试类:ArrayToolDemo。运行。
public class ArrayToolDemo {
public static void main(String[] args) {
int[] arr = {31, 321, 4325, 6, 412, 4, 423};
/*
//为了让程序更严谨,就不需要通过创建对象来调用方法,所以ArrayTool类中的方法都可以修饰为static。
ArrayTool tool = new ArrayTool();
int max = tool.getMax(arr);
System.out.println("Max is: " + max);
int min = tool.getMin(arr);
System.out.println("Min is: " + min);
tool.printArray(arr);//排序前
tool.selectSort(arr);
tool.printArray(arr);//排序后
tool.bubbleSort(arr);
tool.printArray(arr);//排序后
*/
int max = ArrayTool.getMax(arr);
System.out.println("Max is: " + max);
int min = ArrayTool.getMin(arr);
System.out.println("Min is: " + max);
ArrayTool.printArray(arr);//排序前
System.out.println("--------------分割线---------------");
ArrayTool.bubbleSort(arr);//升序
ArrayTool.printArray(arr);//排序后
System.out.println("--------------分割线---------------");
ArrayTool.selectSort(arr);//降序
ArrayTool.printArray(arr);//排序后
}
}
运行结果如下图所示:
05)帮助文档的制作。
/**
* 这是一个可以对数组进行操作的工具类,该类中提供了获取最值,排序(升降序),打印数组中元素等功能。
* @author (作者)
* @version (版本)
* @param (参数)
* @return (返回)
*/
cmd运行示例
将doc文档创建到D盘myhelp文件中。
创建结果如下图所示:
注意:
06)静态代码块
/*
* 静态代码块。
* 格式:
* static{
* 静态代码块中的执行语句。
* }
* 特点:随着类的加载而执行,只执行一次。
* 用于给类进行初始化,并优先有主函数。
*
*/
class StaticCode{
static{//静态代码块。
System.out.println("a");
}
}
public 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");
}
}
运行结果如下图所示: