package Test;函数
public class TestStatic
{
public static void main(String args[])
{
System.out.println("b1.a="+B1.a);
System.out.println("a1.a="+A1.a);
new B1().print();
TestStatic sObj=new TestStatic();
StaticMethod(sObj); //在主函数中能够直接调用静态方法
}
void NonStaticMethod(){
System.out.println("This is a non-sataic method.");
}
static void StaticMethod(TestStatic s){
System.out.println("This is a 静态 method.");
s.NonStaticMethod();
// this.s=s;
}
}this
class A1
{
public static int a=5;
}
class B1 extends A1
{
public static int a=8;
void print(){
System.out.println(super.a);
System.out.println(a);
}
}spa
输出:对象
b1.a=8
a1.a=5
5
8
This is a 静态 method.
This is a non-sataic method.内存
虚拟机会先加载TestStatic类,此时虚拟机会先看看TestStatic类有没有静态的字段,
上例中没有,直接执行main方法。
main方法中第一句代码是打印B1.a,
虚拟机便会去找类B1,找到类B1时,虚拟机发现B1的父亲是A1,
因而父亲优先,先加载A1,
一样,在加载A1时,会看看A1中有什么静态的东西,有,
static int a = 5;
a是静态的,先加载,当把静态的字段加载完后,一个类就算加载完了,
因此A1已经加载完毕,之后不用再加载了。
父亲加载完了,轮到B1了,一样先看看里面有什么静态的字段,有,
static int a = 8;
此时B1也加载完毕了。
第一条打印语句到此时也执行完毕了,
轮到第二条打印语句了。
当执行new B1().print();这句时,
会发生动态绑定,
此时会有一个表明B1对象的this对象传递给print()方法,
因此print()方法中的
System.out.println(a);
实际上是,
System.out.println(this.a);
会打印出一个8出来。
至于super.a就简单了,
打印父类中的a,
结果是5.
到此,main()方法执行完,整个程序退出。编译器
一、 在静态方法中是不能使用this预约义对象引用的,即便其后边所操做的也是静态成员也不行.
由于this表明的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不必定存在 ,super的用法跟this相似,this表明对本类对象的引用,指向本类已经建立的对象;而super表明对父类对象的引用,指向父类对象;.静态优先于对象存在;
由于静态优先于对象存在,因此方法被静态修饰以后方法先存在,而方法里面要用到super指向的父类对象,可是所需的父类引用对象晚于该方法出现,也就是super所指向的对象没有,固然就会出错。综上,静态方法中不能够出现super和this关键字。虚拟机
二、this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西
全部的成员方法,都有一个默认的的参数this(即便是无参的方法),只要是成员方法,编译器就会给你加上this这个参数如:
Class A中
void method1(){}其实是这样的--------> void method1(A this)
void method2(int x){}其实是这样的--------> void method2(A this, int x)
而静态方法与对象无关,根本不能把对象的引用传到方法中,因此不能用this。编译
三、在一个类中定义一个方法为static,则为静态方法,那就是说,无需本类的对象便可调用此方法,调用一个静态方法就是“类名.方法名”,既然"无需本类的对象便可调用静态方法",而this和super关键字都是用于本类对象的-----调用静态方法无需本类的对象这句话很清楚代表:静态方法中不能用this和super关键字, 静态方法是存放在内存中的数据段里,this和super调用的是堆空间里的应用对象不能调用数据段区域里的数据, 静态方法和静态类不属于单个对象,而是类的全部对象共享使用,而this表明当前对象。 所以静态方法中不能用this和super关键字。class
再看下面的例子:变量
package Test;
public class StaticMethod {
//定义一个非静态方法
public void callMe2()
{
System.out.println("This is a nonstatic method");
}
//定义一个静态方法
public static void callMe() //静态方法
{
System.out.println("This is a static method");
}
public void Test(){
callMe(); //正确,能够直接调用访问本类静态方法
callMe2(); //正确,能够直接调用访问本类非静态方法
StaticMethod.callMe(); //调用静态对象无需建立对象,能够直接用“类名。方法名”访问
StaticMethod mob=new StaticMethod();
mob.callMe2(); //调用非静态的使用“对象。方法名”访问
}
public static void main(String[] args){
StaticMethod.callMe(); //静态方法在访问本类的成员时,只容许访问静态方法,在静态方法中不能调用非静态的方法和引用非静态的成员变量
callMe(); //正确,能够直接调用访问本类静态方法
//callMe2(); //静态方法在访问本类的成员时,只容许访问静态方法,因此不能直接访问callMe2();由于callMe2()是非静态的。
StaticMethod oa=new StaticMethod();
oa.Test(); //静态方法在访问本类的成员时,只容许访问静态方法,Test是非静态的,尽管Test内部又调用了静态的CallMe()
}
}
class Run{ public void RunTest(){ // callMe(); //错误 // callMe2(); //错误 StaticMethod.callMe(); //调用静态对象无需建立对象,能够直接用“类名。方法名”访问 //StaticMethod.callMe2(); //错误 StaticMethod ob=new StaticMethod();//调用非静态对象要先实例化对象 ob.callMe2(); //调用非静态的使用“对象。方法名”访问 } public static void Run_main(String[] args){ System.out.println("RunTest"); StaticMethod.callMe(); //静态方法在访问本类的成员时,只容许访问静态方法,在静态方法中不能调用非静态的方法和引用非静态的成员变量 //StaticMethod.callMe2(); //静态方法在访问本类的成员时,只容许访问静态方法,因此不能直接访问callMe2();由于callMe2()是非静态的。 StaticMethod oa=new StaticMethod(); oa.callMe(); //调用静态对象无需建立对象,能够直接用“类名。方法名”访问,也可使用“对象。方法名”访问 oa.callMe2(); //调用非静态的使用“对象。方法名”访问 oa.Test(); //静态方法在访问本类的成员时,只容许访问静态方法,Test是非静态的,尽管Test内部又调用了静态的CallMe() } }