目录)
在静态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();
}
}
❤调用包外的情况
- 第一种导包,只导入到外包类的类名
普通导包格式: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);
}
}
❤ 扩展,静态导入
-
import static static_invoke.OutPack.*;
解释:用.*时,表示导入类中的所有静态属性和方法。使用时,就像使用类内部的静态成员一样没有区别 -
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 包路径.类名.*;则是这个类所有静态成员都相当于类内部的静态成员,再配合上文的规律调用
- 如果是静态导入
博客主要围绕Java类方法调用展开。指出在静态main方法中无法调用同类非静态内部类,可将其改为静态类。详细阐述了静态方法和非静态方法调用其他方法的规则,包括类内部和外部方法的调用方式,还提及了外部静态方法的导入及调用。
&spm=1001.2101.3001.5002&articleId=132374666&d=1&t=3&u=e8be41082f8f4064901e5f9278f7cd82)
1465

被折叠的 条评论
为什么被折叠?



