包:
1、相当于文件夹,用于给文件进行分类管理。
2、给类提供多层命名空间。s文件夹下的文件1,还是r文件夹下的文件1。
3、package 包名(所有字母小写),语句放在代码第一行。注意:有了包之后类名就变成了包名.类名,而不是原来的类名了。
这个错误是因为类名前忘记加了包名。
这个错是因为文件夹下没有这个包,应该把这个类文件放在名为pack的文件夹下。
如何自动生成包文件夹呢?
-d 指定包所存在的位置(目录), . 代表当前目录,就不必再抄一遍了。
正常开发时必须写 类的全名称,先写包再写类。 【包名.类名】 因为你写项目的时候必须要写名是哪组中的类
当然,不指定当前目录也行,
包的出现可以让类文件(运行文件)和原文件相分离。所以,今后再写文件时把class文件和原文件分开存放,利于整理。
但是运行的时候要转到那个目录下,目录写到包的父文件即可。
不同包中的类如何相互访问呢?先来看两篇代码。
代码1:
package first; //包名必须都是小写
class CrossT
{
public static void main(String[] args)
{
second.DemoT d = new second.DemoT(); //类名必须是带着包名的全名。
d.show();
}
}
代码2:
package second;
public class DemoT //这里必须是public 才能被其它类调用,有public还要保证文件名与类名一致
{
public void show() //这里必须是public
{
System.out.println(" I believe you,my lover "+(char)1);
}
}
这里代码1和代码2都在一个文件夹下,它们运行后的class文件也都在另一个文件夹下,代码1调用代码2.
如果建立对象时没有写全类名会报这样的错:
由于分开存放了class文件与原文件,测试运行时需要先设置一下环境变量,如果忘记设环境变量了,会报下面的错:
再假如你忘了在被调用的类前边加public 会报下面的错:
除了被调用 的类前要加public ,被访问的成员也必须公有才可以被访问,否则报这样错:
另外,加了public后的类名和原文件名必须保持一致,否则会报这个错:
这里我文件名是【测试配合.java】而类的名字是【DemoT】所以它让声明DemoT.java
同时,这也决定了一个文件中只能有一个公有类或者接口,不然类名和谁一致??如果真想在一个包里有两个公有类,在包里再建一个文件即可。
如果以上问题都解决了,就可以运行啦,但是,运行时如果没有写全包名,还会有最后一个错等着你:
改正为【包名.类名】即可。效果如下:
另外,跨包之间也可以继承。比如下面这段代码 就可以和以上两篇代码相结合:
package third;
public class DemoT2
{
public void put()
{
System.out.println("you are handsome man,my attractive boy~~"+(char)2);
}
}
代码2改成:
package second;
public class DemoT extends third.DemoT2
{
public void show()
{
System.out.println(" I believe you,my lover "+(char)1);
put();
}
}
运行结果是:
跨包间继承多时,涉及到protected 修饰符的问题,被它修饰的方法,除非是这个方法所在类的子类可以调用,其它不可以。
总结:
1、包与包之间进行访问,被访问包中 的类及成员,需要public 修饰。
2、不同包中的子类可以直接访问父类中被protected权限修饰的成员。
3、包与包之间可使用的权限只有两种:public和protected
4、权限范围:
注意:默认权限的方法子类继承完是不能用的。
5、包里还可以有包,和文件夹一个道理。下面这样是允许的。
为了简化类名的书写,使用Import关键字导入包中的类。
这里注意是导入 【包中的类】而不是文件夹,上图中haha就是个文件夹,不会被导入。
这里不建议用通配符,开发时用哪个导哪个。
定义包名不要重复,可以用url定义,保证包的唯一性,
重点来了, 敲黑板!
Jar包
另有dos操作也可以实现把一堆东西放到一个文件夹中方便查阅,即【数据重定向】,把数据在另一个地方展示。
只要把jar包放在classpath下就可以使用写好的封装工具。