目录
3.为什么类方法只可以调用类方法,引用类变量而实例方法则什么都可以引用与调用?
1.什么是实例方法、实例变量与类方法、类变量?
class demo01 {
int a;//实例变量
static int c;//类变量
void 实例方法(){}
static void 类方法(){}
}
结论:前面用static修饰的就是类方法(也称 静态方法)与类变量(静态变量),不加static的就是实例方法与实例变量。
2.实例方法、实例变量与类方法、类变量的使用
在上一串代码的基础上,我们来使用实例方法、实例变量与类方法、类变量
class demo01 {
int a;//实例变量
static int c;//类变量
void 实例方法(int n) {
a = n; //实例方法中可以调用实例变量
c = n; //实例方法中可以调用类变量
类方法2(); //实例方法可以调用类方法
实例方法2();//实例方法可以调用实例方法
}
static void 类方法(int n) {
a = n; //报错!Cannot make a static reference to the non-static field a 不能让静态引用非静态
//(理解:类方法前有static是静态方法,a是实例变量是非静态的)
//类方法不能引用实例变量
c = n; //类方法可以调用类变量
实例方法2();//报错!Cannot make a static reference to the non-static method 实例方法2() from the type demo01 不能让静态调用非静态方法
//(理解:类方法前有static是静态方法,实例方法2前无static是非静态的)
//类方法不可以调用实例方法
类方法2(); //类方法可以调用类方法
System.out.println("调用了类方法");
}
void 实例方法2() {}
static void 类方法2(){}
}
结论:
实例方法可以调用实类方法、实例方法,可以引用类变量、实例变量(啥都可以调用与引用)
类方法只可以调用类方法,引用类变量。(它是静态的,只能引用静态变量与调用静态方法)
3.为什么类方法只可以调用类方法,引用类变量而实例方法则什么都可以引用与调用?
3.1变量的奥秘
静态变量(类变量)是在类加载的时候分配空间以及赋值的,也就是说无需创建对象,只要类加载了,这个静态变量就会存在,可以供类内所有方法调用。
静态变量随着类的加载而存在,随着类的消失而消失。
实例变量是必须创建对象才会存在的。
实例变量是随着对象的创建而存在,随着对象的被回收而释放。
3.2方法的奥秘
实例方法(动态方法)只有在对象实例化之后才存在。
类方法(静态方法)随着类创建便存在。
理解1:
存在的方法没办法调用不存在的方法。
理解2:
如果允许类方法(静态方法)调用实例方法,将间接地允许它使用实例成员变量,则显然是不可取的,所以它也不能调用实例方法。
4.如何让类方法调用实例方法?
我们对刚刚的代码稍加调整,在类方法中创建对象,调用实例方法。
static void 类方法(int n) {
demo01 demo = new demo01();
demo.实例方法2();
}
void 实例方法2() {}
这种方法没有报错,显然是可取的,也证明了上面结论的正确。
结论:
想要解决类方法无法调用实例方法的情况,那么必须在类方法中实例一个对象来调用实例方法。
理解:也就是我们创建了一个对象,来激活了实例方法,使得实例方法存在了,得以调用了。
5.如何让类方法引用实例变量?
我们在对刚刚的代码进行一个小修改
static void 类方法(int n) {
demo01 demo = new demo01();
demo.实例方法2();
demo.a = 1; //a为刚刚定义的实例变量,如果忘了可以翻到文章开头看代码
}
void 实例方法2() {}
这种方法没有报错,显然是可取的,也证明了上面结论的正确。
结论:
想要解决类方法无法调用实例变量的情况,那么必须在类方法中实例一个对象来引用实例变量。
理解:也就是我们创建了一个对象,来激活了实例变量,使得实例变量存在了,