Java中的包与访问权限的控制
来源:互联网 发布:淘宝图片护盾入口 编辑:程序博客网 时间:2024/06/05 05:27
多人开发
在java中,可以将一个大型项目中的类分别独立出来,分门别类的存到文件里,再将这些文件一起编译运行,如此的程序代码将更易于维护。
多人开发的问题:如果多个开发人员共同开发一个项目的时候,则肯定会出现类名称相同的情况。那么这样一来就会非常麻烦。
相同的文件会出现覆盖的情况。
包的概念
package是在使用多个类或接口时,为了避免名称重复而采用的一种措施,直接在程序中加入package关键字即可。
包的定义格式:
package 包名称.子包名称;
- package org.lxh.demo08.demo ;
- public class Hello{
- public String getInfo(){
- return "Hello World!!!" ;
- }
- };
为程序打包:
- package org.lxh.demo08 ; // 定义一个包
- class Demo{
- public String getInfo(){
- return "Hello World!!!" ;
- }
- };
- public class PackageDemo01{
- public static void main(String args[]){
- System.out.println(new Demo().getInfo());
- }
- };
所谓的包实际上就是一个文件夹,一个*.class文件要保存在一个文件夹之中。既然包本身就是一个文件夹,所以在java的编译指令中就提供了专门的打包编译命令,在编译时加上参数
打包编译:
javac -d . PackageDemo01.java
此时生成完*.calss之后,就可以直接访问了。
java org.lxh.demo08.PackageDemo01
如果在MyEclipse中更简单,直接在src下新建一个org.lxh.demo08的包,直接在包内声明包名,新建java文件即可。
包的导入:
当一个包的class文件需要使用另外一个包的class文件的时候就需要使用导入指令。
import语句
上面的程序,两个类是存放在同一个包中的,因此你代码与之前没有什么根本的不同,但是如果几个类存放在不同的包中,则在使用类的时候就必须通过import语句导入。
Demo.java
- package org.lxh.demo08.a ;
- class Demo{ //默认是default权限,是不能被外包的类所访问的
- public String getContent(){
- return "lx XXX" ;
- }
- };
- package org.lxh.demo08.b ; // 放在不同的包中
- import org.lxh.demo08.a.* ; // 导入不同包中的Demo类
- public class ImportDemo01{
- public static void main(String args[]){
- System.out.println(new Demo().getInfo()) ;
- }
- };
public class与class:
如果一个类声明为public class则文件名必须与类名称一致,而且在一个类中只能有一个public class,而如果使用class声明一个类,则文件名可以与类名称不一致,但是执行的时候必须执行生成的class文件名称。除了这些之外,public class和class在包的访问上有所限制,如果一个类只在本包中访问,不需要被外包访问,则直接声明成class即可,而如果一个类需要被外包访问,则必须声明成public class。而在一般的开发中对于一个*.java 文件中往往只定义一个类:public class。
以上的操作方式是明确的使用了包.类名称的方式导入的。如果要现在假设要导入一个包中的很多类,这样写肯定很麻烦。可以直接使用“*”的方式进行导入。
- package org.lxh.demo08.b ; // 放在不同的包中
- import org.lxh.demo08.a.* ; // 导入不同包中的Demo类
- public class ImportDemo01{
- public static void main(String args[]){
- System.out.println(new Demo().getInfo()) ;
- }
- };
以上的两种导入语句,哪种性能更高?
第一种:import org.lxh.demo08.a.* ;
第二种:package org.lxh.demo08.b ;
实际上两种的性能都是一样的,因为如果使用 * 的方式进行导入,是由JVM帮助用户判定需要导入的类,不需要的类是不会被加载进来的。
但是在导包的时候也要注意另外一个问题,如果导入不同包的同名类的时候就有可能出现不明确的信息。
- package org.lxh.demo08.d ;
- import org.lxh.demo08.a.* ; // 包中存在Demo类
- import org.lxh.demo08.c.* ; // 包中存在Demo类
- public class ImportDemo02{
- public static void main(String args[]){
- Demo d = new Demo() ;
- System.out.println(d.getInfo()) ;
- }
- };
现在定义一个类导入两个包,两个包中都有一个Demo类,此时声明Demo对象的时候就会出现错误,是因为JVM无法区分调用的到底是哪个包中的类。所以如果出现这种情况的时候最好写入完整的“包.类名称”。修改代码如下所示即可。
- package org.lxh.demo08.d ;
- import org.lxh.demo08.a.* ; // 包中存在Demo类
- import org.lxh.demo08.c.* ; // 包中存在Demo类
- public class ImportDemo02{
- public static void main(String args[]){
- org.lxh.demo08.a.Demo d = new org.lxh.demo08.a.Demo() ;
- System.out.println(d.getInfo()) ;
- }
- };
java.util.Arrays.sort()
当然在这些包中,也存在着大量的子包。
JAVA新特性——静态导入
在JDK1.5之后提供了静态导入的功能,什么叫静态导入?如果一个类中的方法全部是使用static声明的静态方法,则在导入的时候就可以直接使用“import static”的方式进行导入,导入的方式如下:
import static 包.类.*;
- package org.lxh.demo08.e ;
- public class Operate{ // 里面的方法全部都是static类型
- public static int add(int i,int j) { // 加法操作
- return i + j ;
- }
- public static int sub(int i,int j) { // 减法操作
- return i - j ;
- }
- public static int mul(int i,int j) { // 乘法操作
- return i * j ;
- }
- public static int div(int i,int j) { // 除法操作
- return i / j ;
- }
- };
- package org.lxh.demo08.f ;
- import static org.lxh.demo08.e.Operate.* ; // 静态导入
- public class StaticImportDemo{
- public static void main(String args[]){
- System.out.println("3 + 3 = " + add(3,3)) ; // 直接调用静态方法
- System.out.println("3 - 2 = " + sub(3,2)) ; // 直接调用静态方法
- System.out.println("3 * 3 = " + mul(3,3)) ; // 直接调用静态方法
- System.out.println("3 / 3 = " + div(3,3)) ; // 直接调用静态方法
- }
- };
静态导入后直接可以调用静态方法即可。
jar命令的使用——将类打包
直接输入jar即可:
JAR命令中的主要参数:
“C”:创建新的文档。
“V”:生成详细的输出信息。
“F”:指定存档的文件名。
- package org.lxh.demo08.demo ;
- public class Hello{
- public String getInfo(){
- return "Hello World!!!" ;
- }
- };
将其打成jar包:jar -cvf my.jar org
表示将文件夹org 就是总文件夹 打包成my.jar
一个jar包如果要想使用的话,则必须配置classpath路径
set classpath= .;e:/XXXX/my.jar
在MyEclipse中直接导入jar包就可使用 import导入jar中的类了。
在实际的Java开发中往往把一些实用的工具类打成jar包交给用户使用。
包的总结:
1、包可以将很多的class文件分类的存放好,这样可以避免多人开发时,类文件重名的问题。
2、在实际的开发中,没有包的类基本上是不存在的,完整的类名称“包.类名称”。
3、如果导入了不同包的同名类的时候,可以直接通过完整的包.类名称避免重复。
4、JDK1.5之后提供了静态导入的功能,可以直接使用一个类的静态方法。
5、如果一个包中的全部类需交付用户使用。则要将其打成一个jar包。
访问控制权限及命名规范。
java中存在四种访问控制权限:
private 私有的访问权限。
default (默认)即不加任何声明的访问权限。
protected 受保护的访问权限。
public 公有的访问权限。
private:可以定义方法或者属性,定义的方法和属性不能被外部的类所访问(包括子类)。
default:可以在本包中的任意地方访问。
protected:保护,不同包中的非子类不能访问。
public:公共的,都可以访问,不受任何限制。
回顾总结:
当产生了一个类之后,为了保证类中的内容不被外部直接看到,则使用private关键字。
但是,如果现在两个有关系的类要进行属性相互访问的话就比较麻烦,之前只能使用setter/getter方法取得和设置,所以为了减少私有属性访问的麻烦,使用类内部类,但是内部类会破坏程序的结构。
为了让一个类的内容继续方便的使用,使用了继承的概念,但是在继承中private属性也是无法被子类看到的,所以此时,为了方便子类的操作,可以将属性进行protected封装,这样一来外部也无法直接看到(不同包)。
之后有了继承之后,既然有了父子关系,所以就可以使用向上或向下的转型操作,以完成多态性。,但是在开发中类与类之间的直接继承并不常见,而往往继承抽象类或实现接口,当若干个操作间需要解耦合的时候就可以使用接口完成。
既然有内部类,则如果一个接口或抽象类的子类只使用一次,则可以将其定义为匿名内部类。
开发中没有包的类是绝对不存在的。
封装—>继承—>多态
java命名规范:
类:所有单词的首字母大写。如:TestJava。
方法:第一个单词的首字母小写,之后每个单词的首字母大写,如:getInfo()。
属性:第一个单词的首字母小写,之后每个单词的首字母大写,如:studentName。
包:所有单词的首字母小写。如: hhxy.lx.pp
常量:所有单词的首字母大写,如:FLAG
0 0
- Java中的包与访问权限的控制
- Java中的包与访问权限的控制
- java的包及访问控制权限
- Java中的访问权限控制
- Java中的访问控制权限
- JAVA中的访问权限控制
- Java中的访问权限控制
- Java中的访问权限控制
- Java中的访问权限控制
- Java中的访问控制权限
- java中的访问权限控制
- Java中的包访问权限
- java 包及访问控制权限备忘
- JAVA中包及访问控制权限
- 4、Java 包及访问控制权限
- Java访问权限的控制
- java的访问控制权限
- Java 访问权限的控制
- Naive Bayes
- Root Mean Squared Error (RMSE)
- 证书 描述文件的安装
- ubuntu下设置开机自启动项
- JS实现带导航城市列表以及输入搜索功能
- Java中的包与访问权限的控制
- 求点A在直线B上的投影点
- 对象赋值问题帮你理解C++四大函数
- 版本更新
- ogg extract 参数配置
- 面试题13:在O(1)时间删除单链表结点
- 深度学习在自然语言处理研究上的进展
- 利用求值器绘制双三次Bezier曲面
- System.load(String filename)和System.loadLibrary(String libname)的区别