加了package后javac编译就无法通过了
aa.java
public class aa
{
String abc;
}
aaa.java
public class aaa extends aa
{
public String getAbc()
{
return abc;
}
}
如果直接这样编译是没有问题的,但是如果分别在两个java文件前加入
package test;
后,就会出现aa.java这个编译通过,但是aaa.java这个编译出错。
请问这是什么原因。
aa.java和aaa.java这两个文件都放在c:\test\目录下
【masse】:
在cmd下进入C盘,而不是C:\test
C:\>javac test/aa.java
C:\>javac test/aaa.java
【masse】:
到C盘下运行你的命令,不要到test目录下。
【viviandou2】:
可是我在test目录下面运行javac *.java的时候又可以通过这是怎么一回事啊?
【stevenzxl】:
不应该阿,公共类,又是同一个包,编译应该没问题啊,报错的信息是什么?
【viviandou2】:
用 masse(当午) 的办法编译是正确的,但是我就是不知道为什么在test目录下用javac *.java
又是正确的。
stevenzxl() 兄,我也是自学的java,所以也不明白啊。
【webHobo】:
Package and ClassPath (静水流深第一版)
这是我的读书笔记,希望能够对大家学习java有所帮助。
所有代码都经过测试,测试环境:
java version "1.4.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)
如大家发现任何错误,或有任何意见请不吝赐教。
quietwater
2003.2.4
写作初衷
首先是我自己遇到了有关package和classpath的问题,经过网友的帮助和
自己的摸索,终于搞清楚原因。后来发现有些网友有着和我同样的问题,所以
决定写篇文章来和大家分享。
正文:
一.private,friendly,protected,public的区别:
private顾名思义就是私有,自己所以自己所用。
包括私有成员变量和私有成员函数, 只有它们所属
的类中的成员函数(包括public friendly
protected and private 也就是所有)可以调用。
public就是共有,大家所以,可以被任何class
调用。
friendly友好,可以被同一个包中的class调用。
如果没有明确声明属于哪一个包package,那么就只
可以被同一个目录中的class调用。因为缺省同一个
目录中的class属于同一个package。
protected保护,它具有friendly的属性,也就是
说它是friendly的超集,protected还可以被子类访问。
二. 缺省package与friendly:
默认情况下在同一个目录下的所有class 在同一个
package 中。所以我们在默认情况下可以调用在同一个
目录中的class 。缺省情况下它们都是friendly。
如果是j2sdk1.4那么我们可以不配置classpath。
但是如果你想import你自己的package ,那么你就必须
配置classpath 了。
三. 问题出在哪里?
举例说明:
d:\mypackage\A.java
package mypackage;
public class A{
public A(){
System.out.println("Create A");
}
}
d:\mypackage\B.java
import mypackage.*;
class B{
B(){
System.out.println("Create B");
}
public static void main(String[] args){
A a=new A();
B b=new B();
}
首先set classpath=.;d:\
表示到当前目录和d盘根目录查找包,包名与目录名一致。如mypackage包
位于d:\mypackage java通过classpath找到d:\然后通过包名找到
d:\mypackage目录,在d:\mypackage目录下找到A.class
D:\mypackage>javac A.java 没问题
D:\mypackage>javac B.java
B.java:7: cannot access A
bad class file: .\A.class
class file contains wrong class: mypackage.A
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
A a=new A();
^
1 error
将B.java移至d:\B.java然后运行
D:\>javac B.java
D:\>java B
Create A
Create B
一切正常。
总结:因为B class不在mypackage中,也就是说B class 要使用在mypackage 中的class,那么class B应该位于mypackage包所在目录之外才能避免冲突。不然默认class B
与它所在目录的class位于同一个package中。
如想运行包中的类,如下:
D:\mypackage>java A
Exception in thread "main" java.lang.NoClassDefFoundError: A (wrong name: mypack
age/A)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:509)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
3)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:246)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)
写全名包名+类名如下:
D:\mypackage>java mypackage.A
Exception in thread "main" java.lang.NoSuchMethodError: main
改写A.java如下,添加main()
package mypackage;
public class A{
public A(){
System.out.println("Create A");
}
public static void main(String[] args){
A a=new A();
}
}
D:\mypackage>java mypackage.A【试验不正确】
Create A
D:\mypackage>javac A.java
D:\mypackage>cd..
D:\java mypackage.A 『试验正确的代码』
【viviandou2】:
错误信息如下:
aaa.java:2: cannot resolve symbol
symbol : class aa
location: class test.aaa
public class aaa extends aa
^
aaa.java:6: cannot resolve symbol
symbol : variable abc
location: class test.aaa
return abc;
^
2 errors
javac编译文件可以忽略import的类嘛 javac编译不了
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Go程序的交叉编译
Go程序的交叉编译是每一位GO程序猿必须掌握的知识点。但是我没有。在昨天,我编译了一个项目,生成了二进制,放到目标机器上,执行报错,错误如下:bash: ./api.linux: cannot execute binary file: Exec format error提示很明显,可执行文件格式错误,不能执行二进制文件。直接定位到了,是目标机器的内核跟我的Macbook Pro不匹配;接着在目标系
cannot execute binar Exec format error GOARCH GO交叉编译 aarch64 -
我的PHP8编译日志
PHP8编译命令
PHP 编译 -
Python 抖音直播间 自动评论
目录前言效果预览评论框列表添加评论从下往上显示支持昵称颜色给出NSAttributedString点赞动画 前言最近做了直播功能,其实难度不是说很大,主要是方案和SDK的选择、整个直播流程的异常处理和优化,还有第三方SDK的填坑。不过本文只是记录下评论框和点赞效果的实现,其他的是用第三方SDK,觉得没什么好分享的,只是了解了直播流程和开发中会遇到的问题。 但看到效果还是蛮激动和蛮有成就感的,这个
Python 抖音直播间 自动评论 粒子动画 CAEmitterLayer CAEmitterCell 直播