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