林煊梅优秀作者
原创内容 来源:小居数码网 时间:2024-08-13 16:54:02 阅读() 收藏:36 分享:56 爆
导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有3696个文字,大小约为14KB,预计阅读时间10分钟。
第八章、包及访问控制权限
8-1、包的定义及导入
package是在使用多个类或接口时,为了避免名称重复而采用的一种措施,直接在程序中加入package关键字即可。包的定义格式:
class Demo{
public String getInfo(){
return "Hello World!!!" ;
}
};
public class PackageDemo01{
public static void main(String args[]){
System.out.println(new Demo().getInfo());
}
};
一个包其实就是一个文件夹,定义包之后,会生成一个名为org的文件夹,里面就有两个类文件。执行程序打包命令:
程序编译完成后会生成一个名为org的文件夹,里面会生成一个Demo.class和PackageDemo01.class的两个类文件。生成完*.class之后就可以直接访问了:
8-2、包的导入
当一个包的class文件需要使用另外一个包的class文件的时候就需要使用导入指令。在之前的程序中,两个类是存放在一个包中的,因此代码与之前没有什么根本的不同,但是如果几个类存放在不同的包中,则在使用类的时候就必须通过import语句导入。
语法:
·import 包名称.子包名称.类名称; 手工导入所需要的类
·import 包名称.子包名称.*; 由JVM自动加载所需要的类
Demo.java:
public class Demo{
public String getContent(){
return "MLDN LXH" ;
}
};
ImportDemo01.java:
import org.lxh.demo08.a.* ; // 导入不同包中的Demo类
public class ImportDemo01{
public static void main(String args[]){
System.out.println(new Demo().getContent ()) ;
}
};
编译的时候应该先编译Demo.java类,之后再编译ImportDemo01.java,因为后者使用了前者的类进行操作。
编译ImportDemo01.java的时候出现了以下的错误提示:
import org.lxh.demo08.a.* ; // 导入不同包中的Demo类
^
ImportDemo01.java:5: 错误: 找不到符号
System.out.println(new Demo().getInfo()) ;
^
符号: 类 Demo
位置: 类 ImportDemo01
2 个错误
也就是说Demo类如果需要被外包访问的时候需要定义成public class,修改Demo类:
public class Demo{
public String getContent (){
return “Hello World!!!”;
}
}
关于public class与class声明类:
如果一个类声明为public class则文件名称必须与类名称一致,而且在一个类中只能有一个public class,而如果使用class声明一个类,则文件名称可以与类名称不一致,但是执行的时候必须执行生成的class文件名称。除了这些之外,public class和class还在包的访问上有所限制,如果一个类只在本包中访问,不需要被外包访问,则直接声明成class即可,而如果一个类需要被外包访问,则必须声明为public class。
以上的操作是明确的使用了包.类名称的方式导入的,如果现在假设要导入一个包中的很多类,这样写肯定很麻烦,我们可以直接使用“*”的方式进行导入:
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.Demo;
·第二种:import org.lxh.demo08.a.*;
实际上这两种的性能都是一样的,因为如果使用后者,是由JVM帮助用户判定需要导入的类,不需要的类,是不会被加载进来的。
但是在导包的时候也需要注意另外一个问题,如果现在导入了不同包的同名类的时候,则就有可能出现不明确的错误信息。
public class Demo{
public String getContent(){
return "MLDN LXH" ;
}
};
现在在org.lxh.demo08.a中有一个Demo类,在org.lxh.demo08.b中也有一个Demo类,之后定义一个类,需要同时导入a 和 c的包。
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.getContent ()) ;
}
};
编译出错:
Demo d = new Demo() ;
^
ImportDemo02.java:6: 错误: 对Demo的引用不明确, org.lxh.demo08.c中的类 org.lxh.demo08.c.Demo和org.lxh.demo08.a中的类 org.lxh.demo08.a.Demo都匹配
Demo d = new Demo() ;
^
2 个错误
所以此时,如果出现这样情况的话,则最好写入完整的“包.类名称”。
修改代码:
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.getContent ()) ;
}
};
8-3、系统常见包
8-4、静态导入
如果一个类中的方法全部是使用static声明的静态方法,则在导入的时候就可以直接使用“import static”的方式导入,导入的格式如下:
import static 包.类.*;
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 ;
}
};
如果按之前的import导入的话,则调用的时候肯定使用的是类.方法()。
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)) ; // 直接调用静态方法
}
};
8-5、jar命令
当开发者为客户开发出了一套JAVA类之后,肯定要把这些类交给用户使用,但是如果所有的类是直接通过*.class的格式给用户,则会比较麻烦,所以一般情况下会将这些*.class文件压缩成一个文件交付给客户使用,那么这样的文件就称为jar文件(Java Archive File),如果要想生成jar文件,直接使用JDK中bin目录里的jar.exe就可以将所有的类文件进行压缩。
JAR命令中的主要参数:
· “C”:创建新的文档
· “V”:生成详细的输出信息
· “F”:指定存档的文件名
选项包括:
-c 创建新的归档文件
-t 列出归档目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用情况任何 ZIP 压缩
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含其中的文件
如果有任何目录文件, 则对其进行递归处理。
清单文件名, 归档文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。
示例 1: 将两个类文件归档到一个名为 classes.jar 的归档文件中:
jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest' 并
将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
jar cvfm classes.jar mymanifest -C foo/。
例:
public class Hello{
public String getInfo(){
return "Hello World!!!" ;
}
};
将其打包编译:javac –d . Hello.java
将其打成jar包:jar –cvf my.jar org
正在添加: org/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: org/lxh/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: org/lxh/demo08/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: org/lxh/demo08/Demo.class(输入 = 300) (输出 = 237)(压缩了 21%)
正在添加: org/lxh/demo08/PackageDemo01.class(输入 = 510) (输出 = 332)(压缩了 34%
)
正在添加: org/lxh/demo08/c/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: org/lxh/demo08/c/Demo.class(输入 = 290) (输出 = 229)(压缩了 21%)
正在添加: org/lxh/demo08/a/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: org/lxh/demo08/a/Demo.class(输入 = 290) (输出 = 229)(压缩了 21%)
正在添加: org/lxh/demo08/d/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: org/lxh/demo08/d/ImportDemo02.class(输入 = 521) (输出 = 341)(压缩了 34
%)
一个jar包如果要想使用的话,则必须配置classpath路径。
例:
import org.lxh.demo08.demo.Hello ;
public class ImportJarDemo{
public static void main(String args[]){
Hello hello = new Hello() ;
System.out.println(hello.getInfo()) ;
}
};
8-6、访问控制权限及命名规范
8-6-1、访问控制权限
Java中存在四种访问权限:
·private访问权限
·default(默认)访问权限
·protected访问权限
·public访问权限
private:可以定义方法,属性,定义的方法和属性不能被类的外部所看到。
default:可以在本包中的任意地方访问。
protected:保护,不同包的非子类不可以访问。
public:公共的,都可以访问,不受任何的限制。
public class HelloDemo{
protected String name = "LXH" ; // 只能在本包及不同包的子类中访问
};
在其他包中访问此类中的属性。
import org.lxh.demo08.g.HelloDemo ;
class SubHelloDemo extends HelloDemo{
public void print(){
System.out.println("访问受保护属性:" + super.name) ;
}
};
public class ProtectedDemo01{
public static void main(String args[]){
SubHelloDemo sub = new SubHelloDemo() ;
sub.print() ;
}
};
如果现在没有使用子类,而是直接在不同类中访问,则会出现无法访问的错误。
import org.lxh.demo08.g.HelloDemo ;
public class ProtectedDemo02{
public static void main(String args[]){
HelloDemo sub = new HelloDemo() ;
System.out.println(sub.name) ; // 错误的,不同包的类无法访问
}
};
编译时出现下面的错误提示信息:
System.out.println(sub.name) ; // 错误的,不同包的类无法访问
^
1 个错误
当产生了一个类之后,为了保证类中的内容不被外部直接看到,则使用private关键字。
但是,如果现在两个有关系的类要进行属性互相访问的话就比较麻烦,之前只能使用getter/setter取得和设置,所以为了减少私有属性的访问的麻烦,使用了内部类,但是内部类本身会破坏程序的结构。
为了让一个类的内容可以继续方便的时候访问,使用了继承的概念,但是在继承中private属性也是无法被子类看到的,所以此时,为了方便子类的操作,可以将属性使用protected进行封装,这样一来外部也无法直接看到(不同包)。
既然有了继承的关系,就可以使用向上或向下的转型操作,以完成多态性,但是在开发中类与类之间的直接继承并不多见,而往往继承抽象类或实现接口,当若干个操作间需要耦合的时候就可以使用接口完成。
既然有内部类,则如果一个接口或抽象类的子类只使用了次,则可以将其定义成匿名内部类。
开发中没有包的类是绝对不存在的。
封装 继承 多态.
8-6-2、java的命名规范
在JAVA中,声明类、方法、属性等都是有一定的规范的,此规范如下所示:
·类:所有单词的首字母大写,如:TestJava
·方法:第一个单词的首字母小写,之后每个单词的首字母大写,如:getInfo();
·属性:第一个单词的首字母小写,之后每个单词的首字母大写,如:studentName
·包:所有单词的字母小写,如:org.lxh.demo
·常量:所有单词的字母大写,如:FLAG
上面就是小居数码小编今天给大家介绍的关于(java包的访问权限)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。
94%的朋友还想知道的:
(451)个朋友认为回复得到帮助。
部分文章信息来源于以及网友投稿,转载请说明出处。
本文标题:Java包权限解释(java包的访问权限):http://sjzlt.cn/shuma/155303.html