package关键字解析

简介

在java中,定义包的关键字是package

在程序中,要区分一些东西,一般会采用【命名空间】的设计方式,这是大多数语言都会采用的方式。

在java中,如果来区分俩个名字一样的类?例如,张三定义了一个类Hello,李四定义了一个类Hello,当把张三和李四的代码合并一起的时候,会出现俩个都叫Hello的类,那么这个时候该如果区分这个类?

可以使用package(包)来进行区分,例如张三定义的Hello这个类可以放在zhangsan这个名字的包下,李四定义的Hello这个类可以放在lisi这个包下,如下:

package zhangsan;
public class Hello{
    
}
package lisi;
public class Hello{
    
}

2.包规则

但是一般程序中,定义包的时候,不会直接用zhangsan、lisi这样的名字,而是都会遵从一些包的命名规则的:

1. package其实就是类的命名空间,用来唯一标识这个类的,避免和的类的名字重复

2. 一般情况,一个公司、组织、社团中所定义的包的名字,就是他们官网的域名(倒过来),因为域名一定是全球唯一的,不可能有俩个一样的域名。

例如,http://commons.apache.org/ 这官网下的代码中的包,都是 package org.apache.commons; 开头的。

例如,我们公司的代码中的包,都是以 package com.xxx; 开头的

例如,你个人写的代码,可以是以 package com.jim; 开头的,假设你的名字叫 jim

3. 类加上了包名,编译之后的效果

这样的类,在编译之后,都必须要有和包名对应的文件夹。
例如,package com.xxx.demo;
这里是三个包,包和包之间用点(.)隔开,编译完之后,需要有对应的三个文件夹分

别是com/briup/demo ,最后在demo目录中,才有编译生产的class文件

一个指定package的类,编译后该如何运行?
例如:

package com.briup.test;

public class Hello {
	
	public static void main(String[] args){
		System.out.println("hello world");
	}

}

编译代码
javac Hello.java

在这里插入图片描述
这里一定要先进入对应的目录下才能直接输入javac Hello.java,不然要输入绝对路径
运行代码:
java Hello

在这里插入图片描述
可以看到运行报错,但是我们已经完全产生了class文件
这个错误的原因是:Hello这个类是定义在指定的包中的,那么就需要在把生成的class文件存放到和包名相对于的文件夹中。

新建一个文件夹,把class文件放进去
在这里插入图片描述
再运行java Hello
在这里插入图片描述
会发现还是报错
这是因为,一个类一旦指定的包,那么在运行它的时候,就一定要带上它的包名

加上包名后再次运行:
java com.briup.test.Hello

在这里插入图片描述
类的名字有俩种:
简单类名:就是直接一个类名,例如 Hello
全限定名:包名加类,例如 com.briup.test.Hello

这时候有人会问了:难道每次编译好一个指定包的类,都需要手动去创建和包对应的目录么?

不需要,java中编码命令中有参数,可以直接帮我们在指定位置自动创建和包名对应的目录结构,并且把编译好的class文件自动存放到里面:
javac -d . Hello.java

在这里插入图片描述
命令中,-d表示编译时自动生成和包名对应的目录结构,-d后面的点(.)表示就在当前目录中生成
注意,编译成功后,还会自动把编译好的class文件存到这个生成的目录中

运行这个编译好的带包的类:
java com.briup.test.Hello

在这里插入图片描述
也可以在指定的路径下,生成和包名对应的目录结构:
javac -d bin Hello.java

在这里插入图片描述
运行这个类:
java com.briup.test.hello

在这里插入图片描述
发现还是报错

这个错误原因是因为,当前路径下没有这个文件夹或者是CLASSPATH中的路径配置的不对,因为我们要运行的Hello类所对应的Hello.class文件,并不在当前目录下,而是./bin中,所以这时候我们可以临时指定一下路径,或者配置CLASSPATH变量

运行当前命令时,临时指定:
java -cp ./bin com.briup.test.Hello

在这里插入图片描述
-cp参数是-classpath的意思,表示执行当前java命令的时候,临时指定classpath一次,只生效这一次
另外,./bin 路径中,可以把./去掉,直接写成bin,因为这样默认就可以表示当前路径下的bin目录

3.规则

运行一个类的时候,JVM加载这个类的规则是什么?

1. 如果运行的Hello类,没有指定包,Hello类一定对应的是Hello.class ( 固定要求)

那么当运行java Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有Hello.class这个文件,如果有那么就加载到内存,然后运行,如果没有那么就报错。

  • 这个情况下,CLASSPATH中就要配置Hello.class文件所在的路径

2. 如果运行的Hello类,指定了包,例如是package com.briup.test; Hello类一定对应的是com/briup/test/Hello.class(固定要求)

那么当运行java com.briup.test.Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有com/briup/test/Hello.class这个文件,如果有那么就加载到内存,然后运行,如果没有那么就报错。
注意,这个时候JVM从CLASSPATH的路径中,会先找com这个文件夹,然后依次找下去。因为如果有包存在的时候,这个包就是这个类不可分割的一部分。

  • 这个情况下,CLASSPATH中就要配置com文件夹所在的路径

3. 如果运行的Hello类,被打包到一个jar中,比如是me.jar

那么当运行java Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有me.jar,如果有那么就从me.jar中将Hello.class载到内存,然后运行,如果没有那么就报错。(这是Hello没指定包的情况)
那么当运行java com.briup.test.Hello的时候,JVM会从CLASSPATH中指定的路径中查找,是否有me.jar,如果有那么就从me.jar中将com/briup/test/Hello.class加载到内存,然后运行,如果没有那么就报错。(这是Hello指定包的情况)

**注意,这时候,是要把jar文件的路径和jar文件的名字,都配置到CLASSPATH中**
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.example.f1_telephone; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.PhoneLookup; import android.database.Cursor; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.content.ContentResolver; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; public class MainActivity extends Activity implements OnItemClickListener{ private ListView listView; private TelephoneAdapter adapter; private List<TelephoneBean>list=new ArrayList<TelephoneBean>(); private TelephoneBean bean; Intent phoneIntent; String str; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView) findViewById(R.id.listView); //得到ContentResolver对象 ContentResolver cr = getContentResolver(); //取得电话本中开始一项的光标 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //向下移动光标 while(cursor.moveToNext()) { //取得联系人名字 int nameFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME); String contact = cursor.getString(nameFieldColumnIndex); //取得电话号码 String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null); while(phone.moveToNext()) { String PhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); bean=new TelephoneBean(contact, PhoneNumber); list.add(bean); } } adapter=new TelephoneAdapter(this, list); listView.setAdapter(adapter); cursor.close(); listView.setOnItemClickListener(this); } private void send1(String number){ Uri uri = Uri.parse("smsto:" + number); Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri); startActivity(sendIntent); } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { str=list.get(arg2).getNumber(); phoneIntent = new Intent("android.intent.action.CALL",Uri.parse("tel:" + str)); AlertDialog dialog=new AlertDialog.Builder(this).setTitle("请选择服务项目").setItems(new String[]{"拨打电话","发送短信"}, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if(which==0){ startActivity(phoneIntent); } if(which==1){ send1(str); } } }).setNegativeButton("取消", null).show(); } } package com.example.f1_telephone; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class TelephoneAdapter extends BaseAdapter{ private Context context; private List<TelephoneBean>list=new ArrayList<TelephoneBean>(); public TelephoneAdapter(Context context,List<TelephoneBean>list) { this.context=context; this.list=list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int arg0) { return list.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { Holde holde=new Holde(); if(arg1==null){ arg1=LayoutInflater.from(context).inflate(R.layout.list_telephone, null); holde.tvname=(TextView) arg1.findViewById(R.id.tv_name); holde.tvnumber=(TextView) arg1.findViewById(R.id.tv_number); arg1.setTag(holde); } else{ holde=(Holde) arg1.getTag(); } TelephoneBean telephoneBean=list.get(arg0); holde.tvname.setText(telephoneBean.getName()); holde.tvnumber.setText(telephoneBean.getNumber()); return arg1; } private class Holde{ public TextView tvname; public TextView tvnumber; } } package com.example.f1_telephone; public class TelephoneBean { public String name; public String number; public TelephoneBean(String name,String number) { this.name=name; this.number=number; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
### 回答1: Ni Package Manager(简称NiPM)是一款开源的软件包管理工具,用于管理和安装软件包。它类似于其他流行的包管理工具,如npm、pip和apt等,但NiPM是专为Ni语言开发的。 Ni Package Manager的主要功能包括: 1. 软件包安装和卸载:NiPM可以方便地安装和卸载各种Ni语言的相关软件包。用户只需简单的命令,就能够获取所需的软件包并安装到本地环境中。同时,用户也可以使用NiPM来卸载不再需要的软件包,释放存储空间。 2. 依赖关系管理:NiPM能够自动解析和安装软件包的依赖关系。当用户安装一个软件包时,NiPM会检查并安装该软件包依赖的其他组件或库文件,确保软件包能够正常运行。 3. 版本管理:NiPM支持管理软件包的不同版本。它可以让用户在安装软件包时选择特定的版本,或者在更新软件包时升级到最新的版本。这样一来,用户可以根据项目要求选择适当的软件包版本,确保项目的稳定性和兼容性。 4. 软件包搜索和发布:借助NiPM,用户可以轻松地搜索已发布的Ni语言软件包。通过关键字和标签的搜索,用户可以快速找到自己需要的软件包。此外,用户也可以使用NiPM来发布自己开发的Ni语言软件包,与其他开发者共享自己的代码和组件。 总而言之,Ni Package Manager是为了更好地管理和安装Ni语言软件包而开发的工具。它提供了便捷的软件包安装、依赖关系管理、版本管理等功能,帮助开发者快速获取所需的软件包,并促进Ni语言生态的发展。 ### 回答2: ni package manager是一个用于安装、管理和更新ni软件包和工具的软件。它是ni系统设计工具的一部分,用于帮助工程师和科学家轻松地获取和安装所需的软件包和工具。 使用ni package manager,用户可以方便地搜索和浏览ni软件包和工具,以及其它第三方软件包。它提供了一个直观的界面,使用户可以快速找到所需的软件,并安装它们到自己的计算机上。 ni package manager还提供了自动更新的功能,可以帮助用户保持已安装软件的最新版本。它会定期检查已安装软件的更新情况,并提供更新通知。用户可以根据自己的需要选择是否进行更新。 此外,ni package manager还支持软件包之间的依赖关系管理。当用户安装一个软件包时,它会自动检测并安装所需的依赖软件包,确保软件能够正常运行。 总之,ni package manager是一个方便实用的软件,可以帮助用户简化软件安装和管理的过程,提供了一个集中管理软件的平台,减少了用户的工作负担。 ### 回答3: Ni Package Manager(简称ni)是一种用于管理软件包的软件。它是一款跨平台的软件包管理工具,可在多个操作系统上使用,如Windows、Linux和macOS等。 ni实现了现代化的软件包管理理念,旨在简化软件安装、更新和卸载的过程。它为用户提供了方便的命令行界面,可以通过简单的命令完成各种软件包操作。 ni通过提供一个集中的软件包存储库,便于用户查找和安装所需的软件包。用户可以使用ni来搜索特定的软件包,查看软件包的相关信息,如版本、依赖关系和安装位置等。用户还可以通过ni来安装、更新或卸载软件包,轻松管理系统中的软件。 ni具有自动解决依赖关系的功能,这意味着当用户安装一个软件包时,ni会自动处理该软件包所需的其他依赖软件包的安装。这大大简化了软件安装过程,减少了用户的繁琐操作。 同时,ni还支持软件包的版本控制功能,使用户可以根据自己的需求选择合适的软件包版本进行安装。这对于程序员和开发人员来说尤为重要,因为他们可能需要使用特定版本的软件包进行开发和测试。 总而言之,ni是一款功能强大、易于使用的软件包管理工具,可以帮助用户方便地管理系统中的软件包。它简化了安装、更新和卸载软件包的过程,提高了用户的工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值