2022.0618学习Java笔记之包及访问控制权限

包的定义

在开发之中所有的系统不会由一个人开发,经常会由多个开发者共同完成,那么在这多个开发者进行项目开发的过程之中一定会出现类重名的问题,但是按照之前的模式,发现所有的*.class文件都在同一个目录下保存,所以一旦出现重名,一定会出现覆盖的情况,为了解决这样的冲突,可以将每一位开发者所开发的类保存在不同的文件夹中(不同的文件夹可以保存同名文件),从而避免掉这种冲突的产生,所以所谓的包实际上就是一个文件夹。

在工作之中,所有的类都一定要放在包之中(不存在没有包的类),每一个类的完整名称都是“包类”。

包使用package关键字进行定义,如果在定义包的时候出现了“.”表示的是子文件夹。

范例:定义包

package cn.mldn.demo;
public class JavaDemo{
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}

本程序与之前相比也只是多了一个package的定义而已,但是下面在进行编译的时候就需要注意了,一定要打包编译:“javac -d . JavaDemo.java”,语法的意义如下

  • “-d”:表示生成文件夹,而文件夹的名称就由package定义
  • “.”:表示在当前所在的目录下保存生成的“包JavaDemo.class”文件

那么当一个类编译完成之后执行的时候不要进入到包之中执行,带着包执行,即:“java cn.mldn.demo.JavaDemo”

包的导入

有了包的定义之后,实际上就将一个完整的项目按照功能保存在不同的包之中。但是进行开发的时候一定会需要这些包之中的类进行互相访问,那么此时就可以使用import关键字使用所需要的包。

范例:定义一个cn.mldn.util.Info类

package cn.mldn.util
class Info {
	public String getMsg(){
		return "Hello World!";
	}
}

 范例:定义使用Info.Java类的程序

package cn.mldn.demo;
import cn.mldn.util.Info;	//导入类
public class JavaDemo{
	public static void main(String[] args) {
		Info info = new Info();
		System.out.println(info.getMsg());
	}
}

 代码写完之后对于程序的编译也是有要求的,应该先编译Info.Java类,然后再编译JavaDemo.Java类但是在编译JavaDemo.Java类的时候出现了错误:错误: Info在cn.mldn.util中不是公共的; 无法从外部程序包中对其进行访问

总结:关于两种类声明的区别

  • public class 类名称:文件名要与类名称保持一致,但是一般而言,在一个*.Java文件里面只能够有一个public class 定义,如果一个类需要被外包所访问那么必须使用public class;
  • class 类名称 :文件名可以与类名称不一致,但是生成的*.class名称是定义得类名称,在一个*.Java文件里面可以同时使用多个class定义多个类,编译之后每一个类会自动生成各自的*.class文件,此类只会被本包所访问; 

修改后的Info.Java类

package cn.mldn.util
public class Info {
	public String getMsg(){
		return "Hello World!";
	}
}

         但是按照之前的编译,需要先编译Info.Java类,在编译JavaDemo.java类,那么如果一个项目有一千多个类就需要使用Java的自动联编的方式:“Javac -d . *.java”。

        那么此时已经可以实现正常的导报操纵,但是也会发现每次导入的时候都需要写上完整的“包类”,这样实在太麻烦,那么就可以使用通配符“*”完成类的自动导入:import cn.mldn.util.*;        //导入类

        但是使用“*”并不意味着要导入一个包之中的全部类,Java在执行的时候只会加载所需要的类,不需要的不会加载。

        但是也可能会遇到另外一种情况,此时假设有两个Info.Java类(cn.mldn.util.Info、cn.mldn.msg.Info),因为某种需求在一个程序之中需要同时导入这两个包。那么因为这两个包之中都存在Info类那么在编译的时候就会出错,所以这个时候最简单的做法就是在实例化对象的时候写上完整的名称,例如要用的是cn.mldn.msg.Info,则在实例化对象的时候这样写:cn.mldn.msg.Info info = new cn.mldn.msg.Info();

注意:所有的包名称一定要采用小写字母的形式出现

jar指令

        当某一个项目开发完成之后,肯定会存在有大量的*.class文件,而且这些*class文件有可能属于不同功能,例如:有一组的包中的类专门完成网络通讯加密功能,这个时候如果把所有的*class文件散着给用户,对于日后的维护是非常不方便的,所以往往会将项目中的*.class文件打成一个压缩文件格式发送给用户使用。那么这样的格式在Java之中使用jar进行表示,而jar是JDK所提供的一个命令。

在jar,命令之中有三个参数是比较重要的 :

  • “ -c ” :创建新文件
  • “ -f ” :定义生成的jar文件的名称
  • “ -v ” :将压缩的详细信息进行显示

下面通过程序讲解

范例:现有一个Info.java类

package cn.mldn.util;
class Info {
	public String getMsg(){
		return "Hello World!";
	}
}

 1、首先将Info.Java类进行编译:javac -d . Info.Java,一定会形成 包.类名称;

2、将生成的类进行打包操作:jar -cvf my.jar cn,将cn目录下的内容打包成my.jar;

3、此时建立JavaDemo.Java类,而且my.jar保存在于JavaDemo.Java同级目录下;

package cn.mldn.demo;
public class JavaDemo{
	public static void main(String[] args) {
		cn.mldn.util.Info info = new cn.mldn.util.Info();
		System.out.println(info.getMsg());
	}
}

         编译JavaDemo.Java类,但是会直接提示“错误:程序包cn.mldn.util不存在”信息,因为找不到cn.mldn.util包。每一个*.jar都是一个独立的路径,所以如果想让*.jar文件之中的类起作用,则必须配置CLASSPATH。

        所有的*.jar文件一定要在CLASSPATH之中进行配置,可以通过工具自动配置。但是通过SET命令设置的CLASSPATH只能够针对于当前窗口完成,也可以直接编辑CLASSPATH环境属性。

系统常见包

学习完了Java程序的基本结构之后,下面的任务就是进行大量类库的学习,那么所有的类库都按照功能保存在不同的包之中。那么下面给出几个常见的程序包(仅仅是Java基础包):

  • java.lang:包含了一些基本的常用类,例如:String、Integer、Object,从JDK1.1开此包自动导入
  • java.lang reflect:反射机制操作包,这是Java语言之所以如此优秀的主要原因;
  • java.util: Java工具包,里面包含了大量的系统类,例如:数据结构支持;
  • java.util regex:正则操作包;
  • Java.io:文件及数据传输编写;
  • java.net:TCP、UDP程序编译;
  • java.sql:数据库操作;
  • org.w3c.dom:DOM操作包,XML文件使用的;
  • java.applet:开发Applet(应用小程序)程序的,不过已经不用了;
  • java.awt、java.xswing: GUI开发包,进行图形界面开发的。

解释:Applet与Application的区别

  • Java程序最早的时候是应用在网页技术上的技术,而当时主推的是Applet,那么Applet需要编写相应的网页程序将*.class文件嵌套在页面之中才可以执行。
  • 而在之前一直所学的属于 Application程序,是利用主方法执行的。

访问控制权限

对于访问控制权限在Java之中一共分为四种:private、default(默认)、protected、public。这四种访问权限才称为封装性。

No范围privatedefault(默认)protectedpublic
1同一包中的同一类
2同一包的不同类
3同一包的不同类
4不同包的不同类

如果是开发就俩选择(99%都是此原则)

  • 如果是定义属性使用private
  • 如果是定义方法使用public

命名规范总结

至此,所有的基本概念全部完成,那么现在也就有了命名规范要求:

  • 类名称:每一个单词的开头首字母大写,例如:TestDemo;
  • 方法名称:第一个单词字母小写,而后每个单词首字母大写,例如:printInfo0;
  • 属性名称:第一个单词字母小写,而后每个单词首字母大写,例如:studentName;
  • 包名称:所有字母小写,例如:cn.mldn.demo;
  • 常量名称:所有字母大写,例如:INFO。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值