我们刚开始跟着书上的代码练习写函数模块时,你可能注意到函数模块都用static来修饰该函数,那么我们不用会怎样,答案是会出错导致无法编译。
如下图片代码
两种解决方案
- 在boolean前面加上static
- 在main函数中加上
test Max=new test();
然后在if语句中的max函数改为Max.max(number1,number2)
,顺利运行。
为什么会这样整哪
因为类中被static修饰的方法从属于类, 而没有被static修饰的方法从属于对象,在对象未被加载进内存时,其所对应的方法无法进行调用,相反 未被static修饰的方法可以调用被static修饰的方法。
敲黑板
java 程序的运行是在jvm上面运行的,jvm虚拟机将内存分为三个区进行运行程序,分别是栈区,堆区,和方法区,至于存储什么内容可以看我上篇博客java类与对象的理解及底层实现原理
下面通过代码进行详细分析
public class testStatic {//类名
int id;
String name;
String pwd;//以上三个普通变量从属于对象 意思是可以通过new一个对象后,通过对象开始调用
static String company="北京尚学堂";//static修饰的变量从属于类
public testStatic(int id,String name){
this.id=id;//this表示从属于当前对象 表示当前对象的引用
this.name=name;
}
public void login(){//从属于对象
//能调用静态方法
login();//从属于对象的方法可以访问类 因为对象就是通过类进行生成的。你的出生肯定有你父亲的存在,并且你了解你的父亲
//但是在你未出生的时候你父亲想给你爱,却给不了,因为那时你还不存在,所以通过类无法访问到对象
System.out.println("登录: "+name);
//能调用静态变量
System.out.println("公司: "+company);
}
public static void printCompany(){//静态方法
//login()调用非静态变量 编译就会报错
//login();//在静态方法中无法调用login函数
System.out.println(company);
}
public static void main(String[] args) {
testStatic user=new testStatic(110,"sofency");
user.printCompany();//通过对象调用printCompany函数
user.login();//对象可以调用
testStatic.printCompany();//通过类调用printCompany 函数
//testStatic.login();类不可以调用
System.out.println();
user.company="锋火";
//login();无法使用非静态方法不在一个区,无法找到位置
user.printCompany();
testStatic.printCompany();
}
}
底层实现原理图