【JavaSE语法】类之间方法的调用(静态方法与非静态方法间的互相调用)

博客主要围绕Java类方法调用展开。指出在静态main方法中无法调用同类非静态内部类,可将其改为静态类。详细阐述了静态方法和非静态方法调用其他方法的规则,包括类内部和外部方法的调用方式,还提及了外部静态方法的导入及调用。

在静态main方法中无法调用同类里的内部类(非静态)

public class Code01_Trie {

    //该前缀树的路用数组实现
    class Trie{//前缀树类
 	}
    public static void main(String[] args) {
     Code01_Trie.Trie trie1 = new Code01_Trie.Trie();//错
     Trie trie1 = new Trie();//错,执行不了
     Code01_Trie trie1 = new Code01_Trie();//对,但调不到内部类
    }
}

解决方法,把内部类改为静态类

Java类之间方法的调用

一、静态方法调用其他方法

注意以下提到的类外的方法和变量,都是默认同包。除非明确提出包外

1.静态方法调用非静态方法

可见,不论是调用类内的非静态方法还是外部类的非静态方法,
在静态方法中调用的只要是非静态的变量或方法时只能用 对象名.方法名 调用。
对象只用一次的话可以用匿名对象

(1)静态方法调用类内的非静态变量/方法

public class Test01 {
    public void test01Method(){
        System.out.println("执行test01的非静态方法");
    }
    public static void main(String[] args) {
        //调用本类方法------------------------
        //错误调用非静态方法
        //test01Method();
        
        //匿名对象调用非静态方法
        new Test01().test01Method();//★
        
        //创建对象调用非静态方法
        Test01 t1 = new Test01();
        t1.test01Method();//★
    }
}

(2)静态方法中调用类外的非静态

public class Test02 {
    public void test02Method(){
        System.out.println("执行test02的非静态方法");
    }
}
public class Test01 {
    public static void main(String[] args) {
		//调用同包不同类方法-------------
        new Test02().test02Method();
        
        Test02 t2 = new Test02();
        t2.test02Method();//★
    }
}

(3)静态方法调用包外的非静态,import导包后同(2)

2.静态方法调用静态方法

类内部的静态方法可以直接调用,类外部的需要类名.静态方法名

  • (1)静态方法调用类内静态
public class Test02 {
    public static void test02StaticMethod(){
        System.out.println("执行test02的静态方法");
    }
    public static void main(String[] args) {
        //调类内部静态方法
        test02StaticMethod();//★
    }
}
  • (2)静态方法调用类外的静态
public class Test01 {
    public static void test01StaticMethod() {
        System.out.println("执行test01静态方法");
    }
}
public class Test02 {
    public static void main(String[] args) {
        //调用同包不同类的静态方法
        Test01.test01StaticMethod();//★
    }
}

二、非静态方法调用其他方法

1.非静态方法调用类内部方法

静态方法和非静态方法都直接调用即可

public class Test03 {
    public static void test03StaticMethod(){
        System.out.println("执行test03静态方法");
    }
    public void test03Method(){
        System.out.println("执行test03非静态方法");
    }
    
    public void method(){//非静态方法调用内部类方法
        test03StaticMethod();
        test03Method();
    }
    
    public static void main(String[] args) {
        new Test03().method();
    }

}

2. 非静态方法调用外部类方法

通过类对象调用该对象方法,通过类名调用静态方法
非静态方法调用外部非静态方法时,必须通过对象.方法名才可以调用。调用静态方法时,可以类.方法名也可以对象名.方法名
但建议静态方法还是使用类名调用,以免与对象方法混淆,且编译期间也会把调用静态方法的对象名.方法名改为类名.方法名

public class Test03 {
    public static void test03StaticMethod(){
        System.out.println("执行test03静态方法");
    }
    public void test03Method(){
        System.out.println("执行test03非静态方法");
    }
}
public class Test04 {
    public void method(){//非静态方法调用外部类方法
        new Test03().test03Method();
        Test03.test03StaticMethod();
    }
    public static void main(String[] args) {
        new Test04().method();
    }
}

❤调用包外的情况

  1. 第一种导包,只导入到外包类的类名
    普通导包格式:import 包路径.类名称;方便new类对象,调用类对象的方法
    结构 如下,导包 import static_invoke.OutPack;
    这种导包情况下,使用时和调用同包外类的调用方法一样。
    在这里插入图片描述
package static_invoke;

/**
 * Created with IntelliJ IDEA 2024.1.4.
 * jdk 17.0.12
 *
 * @Authur: xuexuezi
 * @Date: 2026/01/27/下午9:40
 * @Description:
 */
public class OutPack {
    public int opNum = 5;
    public static int sOpNum = 6;
}

package static_invoke.non_static;

public class StaticInvoke {
    int exNum1 = 3;
    static int sExNUm2 = 4;


}
package static_invoke.non_static;
import static_invoke.OutPack;//包外
/*回忆:静态和非静态的互相调用写法
 * 1. 静态方法内的调用
 * 1) 要调非静态的,一律->new对象后调用该对象的非静态方法
 * 2-1)调静态的,内部的->直接调(即直接使用变量或方法)2-2) 同包不同类外部的->类名.静态 调用
 *
 * 2. 非静态方法内的调用
 * 1)类内部都是->直接调,不论静态或非静态
 * 2-1)调同包不同类的外部方法,非静态就 new 对象
 * 2-2)静态就类名.名*/


public class Main {

    /*设置了三组,静态和非静态变量。s开头都是非静态*/
    int num = 1;
    static int sNum = 2;

    public static void main(String[] args) {
        /*静态方法调用主要区分调用的是非静态还是静态*/
        System.out.println("静态方法main调用本类非静态" + new Main().num);
        //,多一个import导入外包的类OutPack
        StaticInvoke staticInvoke = new StaticInvoke();
        System.out.println("静态调用同包外类非静态" + staticInvoke.exNum1);
        ////必须import导入
        System.out.println("静态方法调用外包的非静态" + new OutPack().opNum);;

        //
        System.out.println("静态调用静态//内部类的" + sNum);
        //
        System.out.println("静态调用外类的" + StaticInvoke.sExNUm2);
        //外包的//前提有导包
        System.out.println("import导包后,静态调用外包的" + OutPack.sOpNum);

        System.out.println("-------------------非静态方法的调用------------------");
        new Main().testOutPack();
    }
    /*★*/
    void testOutPack(){
        /*非静态调用主要区分是内部还是外部*/
        //调内部,统一直接调
        System.out.println("类内非静态" + num);
        System.out.println("类内静态" + sNum);

        //调外部类
        System.out.println("调类外非静态" + new StaticInvoke().exNum1);
        System.out.println("调类外静态" + StaticInvoke.sExNUm2);

        //调用外包的,普通导包后一切调用规则都跟外部类的一样
        System.out.println("调外包的非静态"+ new OutPack().opNum);
        System.out.println("调用外包的静态" + OutPack.sOpNum);
    }
    

}

❤ 扩展,静态导入

  1. import static static_invoke.OutPack.*;
    解释:用.*时,表示导入类中的所有静态属性和方法。使用时,就像使用类内部的静态成员一样没有区别

  2. import static staitc_invoke.OutPack.sOpNum;
    用静态名称时,表示只导入该静态属性或方法。
    import static导入外部类的静态方法,在本类的静态方法中就可以直接调用,不用类名.方法名

注意!如图,只静态导入的话

  • 是无法使用外包类中的非静态成员的,只能使用OutPack的静态成员。
  • 并且无法使用类名,因为只是导入了该类的静态成员,并不是该类
    在这里插入图片描述
    静态导入的正确调用
package static_invoke.non_static;
//import static static_invoke.OutPack.sOpNum;
import static static_invoke.OutPack.*;

/**
 * Created with IntelliJ IDEA 2024.1.4.
 * jdk 17.0.12
 *
 * @Authur: xuexuezi
 * @Date: 2026/02/07/下午9:32
 * @Description:
 */
public class ImportMain {
    /*设置了三组,静态和非静态变量。s开头都是非静态*/
    int num = 1;
    static int sNum = 2;

    public static void main(String[] args) {
        /*静态方法调用主要区分调用的是非静态还是静态*/

        ////必须import导入
        //System.out.println("静态方法调用外包的非静态" + new OutPack().opNum);;

        //外包的//前提有导包
        System.out.println("import导包后,静态调用外包的" + sOpNum);/*★*/

        System.out.println("-------------------非静态方法的调用------------------");
        new Main().testOutPack();
    }
    
    void testOutPack(){
        /*非静态调用主要区分是内部还是外部*/

        //调用外包的,普通导包后一切调用规则都跟外部类的一样
        //❌️System.out.println("调外包的非静态"+ new OutPack().opNum);
        //❌️System.out.println("调用外包的静态" + OutPack.sOpNum);
        System.out.println("调用外包的静态" + sOpNum);/*★*/
    }

}

  • 例2
    静态导入同包外类的成员
    结果:该类的静态成员使用时不用再加类名
public class Test01 {
    public static void test01StaticMethod() {
        System.out.println("执行test01静态方法");
    }
}
//这两句导包写法都可以
//import static review.demo02.Test01.test01StaticMethod;
import static review.demo02.Test01.*;
public class Test02 {
    public static void test02StaticMethod(){
        System.out.println("执行test02的静态方法");
    }
    public void test02Method(){
        System.out.println("执行test02的非静态方法");
    }

    public static void main(String[] args) {
        //调类内部静态方法
        test02StaticMethod();
        
        //调用同包不同类的静态方法
        //若没有导入,写法应该是Test01.test01StaticMethod()
        test01StaticMethod();/*★*/

    }
}

例如:此处Test01和Test02类不在同一个包,所以普通导入和静态导入都可以做普通导包如果.*导入包内所有成员的话,功能是覆盖静态导入的
若在同一个包,new类对象.普通方法不用导包,类名.静态方法名也不用导包。只是需要加类名
但想要直接调用静态方法不写类名,还是需要导包
在这里插入图片描述

总结

  • 非静态方法调用内部类方法:一律直接调

    • 非静态方法调用外部类方法:静态方法用类名.方法名
    • 非静态方法用对象名.方法名
  • 静态方法调用非静态方法:一律用对象.方法名

    • 静态方法调用静态方法:内部类的方法直接调,
    • 外部类的方法用类名.方法名

  • 关于导包
    • 如果是导包全部,即import 包路径.类名.*; 则这个包外部的类所有成员都相当于类内部的成员
    • 如果是静态导入 import static 包路径.类名.*;则是这个类所有静态成员都相当于类内部的静态成员,再配合上文的规律调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值