1、能否在一个类中调用另一个类里的方法?
me.java中写2个calss代码如下:
class me
{
public static void main(String[] args)
{
// 在me这个类里调用myname类的静态方法
myname.showName();
}
}
class myname
{
public static void showName()
{
System.out.println("my name is jack");
}
}
编译:终端执行
javac me.java
运行me
这个类:
java me
终端控制台输出my name is jack
。
这说明在我们同一个文件目录下,可以互相调用。
如果我们删除myname.class
这个文件,肯定就不能运行me
这个类了,会报如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: myname
at me.main(me.java:6)
Caused by: java.lang.ClassNotFoundException: myname
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
在我们的开发中一般不会在一个文件里写多个class,我们把me类和myname类
的代码拆分成2个文件:me.java
和myname.java
然后编译me.java
:
javac me.java
发现同样生成了me.class
和myname.class
这2个二进制文件。
这是因为在我们的me类
中调用了myname类
里的showName()
方法。
class me
{
public static void main(String[] args)
{
//myname.showName();
}
}
如果我们在me类
不涉及到myname类
,那么编译me.java
就只是生成me.class
文件,不会生成myname.class
文件。
创建包(package)
我们的java文件不可能都只是一个在目录下,所以我们现在创建一个叫my
的子目录,把myname.java
文件移动到该目录下。
此时myname.java
代码肯定要有所变化了,注意看:
package my;
// 注意:因为现在myname和me不同包(pagckage)
// 所以要加上修饰符
public class myname
{
public static void showName()
{
System.out.println("my name is jack");
}
}
然后我们编译:
javac me.java
生成了各自的.class文件:
有逼格的编译
现在我们的.class文件和.java文件,编译之后都是混合在一起,太不好看了。
1.把编译出来的.class文件放到指定的目录
javac -d target me.java
#首选确保你有这个target文件夹
这样就把.class
文件都编译到target目录下了,并且还保持了包文件夹。
为了目录结果的美观,一般把源码文件放到一个叫src
的文件夹里:
把.java
源码文件移动到src
目录下。
然后编译:
javac -d target -sourcepath src src/me.java
运行:
cd target/
java me