轉載請標明出處:http://blog.csdn.net/wu_wxc/article/details/49539247
本文出自【吳孝城的CSDN博客】
static是一個成員修飾符
定義功能時,如果功能不需要訪問類中定義的非靜態成員變量時,該功能就需要靜態修飾
如果一個數據需要被其所在類的所有實例共用時,就要用static修飾
靜態方法注意事項:
1、靜態方法只能訪問靜態成員,不能訪問非靜態的成員,
靜態方法可以調用非靜態方法,要用創建對象(new)的方法調用
好處:可以直接被類名調用,開發中建議用類名調用,不要創建對象調用:
類名.方法();
而不用:
類名 名稱 = new 類名();
名稱.方法();
1、靜態方法中不允許出現this,super關鍵字
原因:
1、靜態是隨着類的加載而加載的,也隨着類的消失而消失
2、靜態優先於對象存在,被對象共享,
3、因爲靜態先存在於內存中(當類加載的時候就進入內存),無法訪問後來的對象中的數據,
所以靜態無法訪問非靜態(非靜態是在調用的時候才進內存)
而且內部無法書寫this,因爲這時對象可能不存在,this沒有任何指向
class Student{
private String name; //成員變量
private int age; //成員變量
Student(String name, int age){
this.name = name;
this.age = age;
}
//speak方法訪問成員變量,所以不不需要靜態修飾
//訪問了對象屬性,所以爲非靜態
public void speak (){
System.out.println("name=" + this.name + "age=" + this.age);
}
//定義一個學習功能,沒有訪問成員變量,需要靜態修飾
public static void study(){
System.out.println("學習......");
}
}
class StudentDemo{
public static void main(String[] arge){
/*不建議用創建對象調用
Student p = new Student("haha", 20);
p.study();
*/
//建議用直接用類名調用
Student.study();
}
}
靜態變量和成員變量的區別:
1、所屬範圍不同
靜態變量所屬於類,成員變量所屬對象,靜態對象的數據在全局是唯一的,一改全改
靜態變量也稱爲類變量。成員變量也稱爲實例變量,對象變量
2、調用不同
靜態變量可以被對象和類調用(一般都用類名調用)
成員變量只能被對象調用
3、加載時期不同
靜態變量隨着類的加載而加載
成員變量隨着對象的加載而加載
4、內存存儲區域不同
靜態變量存儲在方法區中
成員變量存儲在堆內存中
靜態的主函數
public static void main (String[] args)
public :權限最大
static :不需要對象,直接用給定的類名就可以訪問該函數
void :不需要返回值,主函數是虛擬機調用的
main :固定的函數名
(String[] args) :主函數的參數列表,字符串類型的參數
args:全稱arguments ,參數,唯一可變的名稱
class MainDemo {
public static void main (String[] args){
//靜態函數不能用類名調用非靜態函數,
//show();
//MainDemo.show();
//cla.show();
//想調用非靜態函數,要用對象調用
new MainDemo().show();
new cla().show();
}
//非靜態方法
void show(){
System.out.println("show run");
}
}
class cla{
void show(){
System.out.println("static class show");
}
}
構造代碼塊
class Demo{
int x = 10;
{ /*構造代碼塊,只要創建對象會被調用,給所有對象初始化,
構造函數只給對應的對象針對性的初始化*/
//可以定義不同構造函數的共性代碼
System.out.println("code run..." + 4); //打印結果爲4
}
Demo(){
System.out.println("demo run");
}
Demo(int x){
System.out.println("demo run...." + x);
}
}
class ConstructorCodeDemo{
public static void main(String[] args){
new Demo();
new Demo(5);
{ //局部代碼塊
//如果一個變量只在這裏被調用,可以放在局部代碼塊裏,這樣不會浪費內存
int i = 10;
System.out.println("局部代碼塊... "+ i);
}
}
}
靜態代碼塊
特點:隨着類的加載而加載,僅執行一次
作用:給類進行初始化。例如註冊
class Demo {
int x = 10; //非靜態變量,無法直接給靜態的靜態代碼塊調用
/*
要將變量修飾爲靜態後纔可以被調用,
靜態這是有兩次初始化,第一次是默認初始化,
第二次爲顯示初始化,就是賦值*/
static int x = 10;
static{ //靜態代碼塊
System.out.println("類一加載就執行的部分" + x); //打印結果爲10
}
static void show(){
System.out.println("show run");
}
}
class StaticCode{
public static void main(String[] args){
Demo.show();
}
}