被static关键字修饰的方法称为静态方法 没有被static关键字修饰的方法一般称为非静态方法。同理 被static关键字修饰的成员变量 叫静态的成员变量 没有被static 修饰叫非静态成员变量
静态方法 只能访问静态的成员变量 如果访问非静态的成员变量 那么无法通过编译
访问方式:
无需创建对象 使用类名就可以直接调用
举例:
class test12{
public static int i;
public static void main(String[] args){
//类名直接访问
System.out.print(test12.i);
//类名直接访问静态方法
int j=test12.f1();
System.out.print(j);
}
public static int f1(){
return i;
}
}
非静态方法 既能访问静态的成员变量 也能访问非静态的成员变量
访问方式
只能通过创建对象的方式进行调用
//以创建对象的方式调用
test12 t=new test12();
t.f2();
}
public static int f1(){
return i;
}
public int f2(){
//访问静态变量
return i;
}
public int f3(){
//访问非静态变量
return k;
}
}
静态的方法或者成员变量被整个程序共用,相当于共享
class Person
public static int i;
public Person(){
}
public static int sumNumber(){
return true;
}
public static void main(String [] args){
System.out.println(Person.i);
}
**静态的方法或者成员变量被整个程序共用,相当于共享**
class test{
public static void main(String [] args){
System.out.println(Person.i);
System.out.println(Person.sumNumber());
}
}
注意:
被static修饰的内容在代码程序中会按照顺序进行加载,如果主函数在下面,那么会优先加载静态成员变量和成员方法
package main;
public class StaticTest {
//1 先执行private static StaticTest st=new StaticTest();
//1 此时count1 count2 都为0
private static StaticTest st=new StaticTest();
//3 执行private static int count2=0的赋值操作 此时count1=1 count2=0
private static int count1;
private static int count2=0;
//2 调用构造器 count1 count2进行++ count1和count2值都变为1
public StaticTest(){
count1++;
count2++;
System.out.print("11111");
}
/**
* static 代码块在程序中只执行一次,被static修饰的代码都是按照代码的顺序被调用的
* 如果主函数在下面,那么会优先加载静态成员变量和成员方法
*/
static{
System.out.print("00000");
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.print("222222");
// TODO Auto-generated method stub
//4 执行主函数 StaticTest st=StaticTest.getInstance()
//4 此时没有创建新对象,只是进行一个对象的赋值操作 所以count1还是为1 count2还是为0
StaticTest st=StaticTest.getInstance();
System.out.println("count1 "+count1);
System.out.println("count2 "+count2);
}
public static StaticTest getInstance(){
System.out.print("33333");
return st;
}
}
栈空间存储的是局部变量,基本数据类型变量,引用类型的引用
堆空间存储的是对象,常量池(在方法区中)
静态区用于存放static关键字所存储的内容