1. 程式人生 > >第2章 static靜態關鍵字

第2章 static靜態關鍵字

Java

1.1 靜態的概述
當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過創建本類對象調用的。當在調用對象的某個方法時,這個方法沒有訪問到對象的特有數據時,方法創建這個對象有些多余。可是不創建對象,方法又調用不了,這時就會想,那麽我們能不能不創建對象,就可以調用方法呢?
可以的,我們可以通過static關鍵字來實現。static它是靜態修飾符,一般用來修飾類中的成員。
1.2 靜態的特點
A: 被static修飾的成員變量屬於類,不屬於這個類的某個對象。(也就是說,多個對象在訪問或修改static修飾的成員變量時,其中一個對象將static成員變量值進行了修改,其他對象中的static成員變量值跟著改變,即多個對象共享同一個static成員變量)
B: 被static修飾的成員可以並且建議通過類名直接訪問
訪問靜態成員的格式:
類名.靜態成員變量名
類名.靜態成員方法名(參數)
C: 靜態的加載優先於對象,隨著類的加載而加載
1.2.1 案例代碼四

package com.itheima_01;
/*
 * static:他是一個關鍵字,用來修飾成員變量和成員方法
 * static特點:
 * 被所有的對象所共享
 * 可以直接使用類名來調用
 * 靜態所修飾的成員加載優先於對象
 * 隨著類的加載而加載
 *
 */
public class StaticDemo {
public static void main(String[] args) {
Student.graduateFrom = "傳智學院";
//創建學生類的對象
Student s = new Student();
//為對象的成員變量進行賦值
s.name = "小蒼同學";
s.age = 18;
//s.graduateFrom = "傳智學院2";
s.show();
Student s2 = new Student();
s2.name = "小波同學";
s2.age = 20;
//s2.graduateFrom = "傳智學院";
s2.show();
}
}
package com.itheima_01;

public class Student {
String name;
int age;
static String graduateFrom;//畢業院校
public void show() {
System.out.println(name + "," + age + "," + graduateFrom);
}
}

1.3 靜態的內存圖解
技術分享圖片

1.4 靜態的註意事項
A:靜態成員只能直接訪問靜態成員
B:非靜態成員既可以訪問非靜態成員也可以訪問靜態成員
1.4.1 案例代碼五

package com.itheima_01;
/*
 * static的註意事項:
靜態方法
可以調用靜態的成員變量
可以調用靜態的成員方法
不可以調用非靜態的成員變量
不可以調用非靜態的成員方法
只能在靜態的方法中調用靜態的成員
非靜態方法
可以調用靜態的成員變量
 *
 */
public class StaticDemo2 {
public static void main(String[] args) {
//為Person類的靜態成員變量進行賦值
Person.graduateFrom = "傳智學院";
//創建Person類的對象
Person p = new Person();
//p.study();
p.eat();
//Person.study();
}
}

package com.itheima_01;

public class Person {
String name;
int age;
static String graduateFrom;//畢業院校
public static void study() {
System.out.println(graduateFrom);
//sleep();
//System.out.println(name);
//eat();
}
public static void sleep() {
System.out.println("sleep");
}
public void eat() {
//System.out.println("eat");
//System.out.println(graduateFrom);
//study();
System.out.println(name);
method();
}
public void method() {
System.out.println("method");
}
}

1.5 靜態的優缺點
A:靜態優點:
對對象的共享數據提供單獨空間的存儲,節省空間,沒有必要每一個對象都存儲一份
可以直接被類名調用,不用在堆內存創建對象
靜態成員可以通過類名直接訪問,相對創建對象訪問成員方便
B:靜態弊端:
訪問出現局限性。(靜態雖好,但只能訪問靜態)
1.6 靜態應用1.6.1 Math類使用
A:Math 類包含用於執行基本數學運算的方法。數學操作常用的類。
B:Math類的構造方法被private,無法創建對象,也就無法通過對象來訪問Math類中的成員
C:Math類中所有的成員都被靜態修飾,因此我們可以直接通過類名訪問
1.6.1.1 案例代碼三:

package com.itheima_02;

public class MathDemo {
public static void main(String[] args) {
//Math:包含了一些基本的數學運算方法
//static double PI  
//System.out.println(Math.PI);
//static double abs(double a)  :返回絕對值
//System.out.println(Math.abs(15));
//System.out.println(Math.abs(-10));
//static double ceil(double a) 天花板   向上取整
//System.out.println(Math.ceil(1.2));
//System.out.println(Math.ceil(1.6));
//static double floor(double a)  地板  向下取整
//System.out.println(Math.floor(1.2));
//System.out.println(Math.floor(1.6));
//static long round(double a)  :四舍五入
//System.out.println(Math.round(1.2));
//System.out.println(Math.round(1.6));
//static double max(double a, double b)
//System.out.println(Math.max(3, 4));
//static double pow(double a, double b) :返回第一個參數的第二個參數次冪
//System.out.println(Math.pow(3, 2));
//static double random() :返回一個隨機數,大於零且小於一
System.out.println(Math.random());

}
}

1.6.2 自定義工具類
A:需求:自定義一個專門對數組操作的工具類,具有的功能如下
1.定義一個方法,該方法可以返回數組中最大元素
2.定義一個方法,該方法根據指定的值去數組中查找是否存在該值
存在,返回該值在數組中的索引
不存在,返回-1
1.6.2.1 案例代碼四:

package com.itheima_03;

public class MyArrays {
private MyArrays() {}
/*
 * 返回數組中最大的元素
 *
 */
public static int getMax(int[] arr) {
int max = 0;//參照物
//遍歷數組
for(int x = 0;x < arr.length;x++) {
if(arr[x] > max) {
max = arr[x];//替換參照物
}
}
return max;
}
/*
 * 返回數組中指定參數的索引
 *
 */
public static int getIndex(int[] arr,int a) {
//遍歷數組
for(int x = 0;x < arr.length;x++) {
if(arr[x] == a) {
return x;
}
}
return -1;//如果查不到制定的參數,則返回-1
}
}
package com.itheima_03;

public class MyArraysDemo {
public static void main(String[] args) {
int[] arr = {3,5,8,10,1};
int max = MyArrays.getMax(arr);
System.out.println(max);
int index = MyArrays.getIndex(arr, 8);
System.out.println(index);
}
}

1.7 類變量與實例變量辨析
A:類變量:其實就是靜態變量
定義位置:定義在類中方法外
所在內存區域:方法區
生命周期:隨著類的加載而加載
特點:無論創建多少對象,類變量僅在方法區中,並且只有一份
B:實例變量:其實就是非靜態變量
定義位置:定義在類中方法外
所在內存區域:堆
生命周期:隨著對象的創建而加載
特點:每創建一個對象,堆中的對象中就有一份實例變量

第2章 static靜態關鍵字