方法我们主要分为三种:
1.构造方法
2.非静态方法(普通方法/实例方法)
3.静态方法(类方法)
一直对于两个问题有些疑惑:
1、为什么this在main函数中没有出现,而广泛出现在一些项目代码中
2、为什么在main函数中,静态方法不需要实例化,而非静态需要实例化
对于静态和非静态的理解,首先有一点非常重要:
非静态方法属于类的实例化对象,静态方法不属于类的某个对象而是属于这个类
1.mian属于静态方法,所以我们先来研究静态方法如何调用静态方法
调用静态方法可以无需创建对象
public class MyClass {
public static void myStaticMethod1() {
// 通过类名直接调用静态方法 //myStaticMethod2();也可
MyClass.myStaticMethod2();
// 或者通过对象调用静态方法
// MyClass obj = new MyClass();
// obj.myStaticMethod2(); //不建议使用,会造成概念混淆
}
public static void myStaticMethod2() {
// 静态方法的实现
}
}
2.静态方法如何调用非静态方法
必须实例化
public class Example {
public static void myStaticMethod() {
Example ex = new Example();
ex.myDynamicMethod();
}
public void myDynamicMethod() {
System.out.println("This is a dynamic method.");
}
}
3.怎么在非静态方法中调用静态方法
不需要实例化,可直接访问
public class MyClass {
public static void myStaticMethod() {
// 静态方法的实现
}
public void myDynamicMethod() {
// 动态方法的实现
MyClass.myStaticMethod(); // 直接使用类名调用静态方法
//myStaticMethod();也可
}
}
当你在同一个类的动态方法中调用静态方法时,Java虚拟机会首先在当前类中查找这个静态方法,然后进行调用。所以在同一个类中,即使没有使用类名也可以直接调用静态方法。
4.怎么在非静态方法中调用非静态方法
一定需要实例化!!(详见Java this关键字详解(3种用法) (biancheng.net)的this.方法名)
this 可以代表任何对象,当 this 出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的只能是当前类的实例。只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用这个方法,this 就代表谁。
public class MyClass {
public void myMethod1() {
// do something
}
public void myMethod2() {
this.myMethod1();
// Myclass myclass = new Myclass();
// myclass.myMethod1(); 等效
// myMethod1();也是可以的,但容易混淆
}
}
值得注意的点,只要调用非静态方法(实例方法),一定要实例化。
但是在非静态方法中调用非静态方法,可以借助外部的实例对象直接调用,而不用在类中再次实例化对象。
所以结论是:
1、静态方法调用是采用的类名.方法
2、非静态方法调用是采用的对象名.方法(this.方法名只能用于内部调用)
3、静态⽅法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态⽅法),不允许
再回到最开始的,其实问题1、2是一个问题,都是对于静态和非静态方法的考察。
回答问题1,this无法用于main函数是因为,this引用的是当前对象。但是main是静态方法,不是对象,所以我们不能用this。
回答问题2,静态方法调用非静态方法一定要实例化。
下面是在mian函数中调用静态和非静态,public和private的四种情况:
public class Main {
private static int privateStaticCount = 0;
private int privateCount = 0;
public static int publicStaticCount = 0;
public int publicCount = 0;
private static void privateStaticMethod() {
System.out.println("This is a private static method.");
}
private void privateMethod() {
System.out.println("This is a private method.");
}
public static void publicStaticMethod() {
System.out.println("This is a public static method.");
}
public void publicMethod() {
System.out.println("This is a public method.");
}
public static void main(String[] args) {
// 调用private静态方法
privateStaticMethod();
// 调用private非静态方法需要通过对象实例调用
Main obj = new Main();
obj.privateMethod();
// 调用public静态方法
publicStaticMethod();
// 调用public非静态方法需要通过对象实例调用
obj.publicMethod();
// 访问静态变量
privateStaticCount++;
publicStaticCount++;
// 访问非静态变量需要通过对象实例访问
obj.privateCount++;
obj.publicCount++;
}
}