Java访问性与包的讲解

一、Java中的访问控制

     1、private修饰词,表示成员是私有的,只有自身可以访问;   
     2、protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员,同时相同包内的其他类也可以访问protected成员。   
     3、无修饰词(默认),表示包访问权限(friendly, java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++ ),同一个包内可以访问,访问权限是包级访问权限;  
     4、public修饰词,表示成员是公开的,所有其他类都可以访问;

具体可见如下表:

                                表1-1J ava中的访问控制

可见/访问性在同一类中同一包中不同包中 同一包子类中 不同包子类中 
 public yes yes yes yes yes
 protected  yes yes no yesyes
 package  yes yes no yes  no
 private yes no no no no

 注意:Java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。

补充说明:
     (1)每个编译单元(类文件)都仅能有一个public class 
     (2)public class的名称(包含大小写)必须和其类文件同名。 
     (3)一个类文件(*.java)中可以不存在public class。 
     (4)如果我们在某个包内撰写一个class,仅仅是为了配合同一包内的其他类工作,并且我们不想再为了撰写说明文档给客户(不一定是现实意义的客户,可能是调用这个类的类)看而伤脑筋;或者有可能过一段时间之后会彻底改变 原有的做法,并以全新的版本代替旧版本,这种情况下一般会默认。
     (5)class不可以是private和protected。

使用范例:

package com.visible.test;
/**
 *基础类
 */
class Base{
public int a;
protected int b;
private int c;
int d;
}
/**
*继承类
*/
class Deprive extends Base{
public void set(){
	a=1;
	b=2;
	//c=3;//出错
	d=4;
}
	
}

public class Main {
	public static void main(String[] args) {
	
   Base m_Base=new Base();
   m_Base.a =1;
   m_Base.b=2;
  // m_Base.c=3;//出错
   m_Base.d=4;
   
   Deprive m_deprive=new Deprive();
   m_deprive.set();
	}

}

二 包


1、 包

    包名一般为小写,而类名的第一个字母一般为大写,这样在引用时,可以明显的分辨出包名和类名。如果在类的定义之前没有使用package定义包名,那么该类就属于缺省的包。


2、Hello Package
首先通过一个简单的package的定义来学习package的使用:

package testPackage;
public class Test
{
 public static void main(String args[])
 {
  mNode node = new mNode();
  node.print("hello");
 }
}

说明:
(1) 使用package关键字指明类所在的包;
(2) package语句必须在文件的最前面;
(3) 编译时可使用javac –d . Test.java自动产生包需要目录;
(4) 可以使用java testPackage.Test来执行编译后的代码;


3、 包的几个作用:
    (1) 可以更好的组织类,包与文件夹类似,文件夹可以将不同的文件放在同一个文件夹中,而包也可以将不同的类文件放在同一包中;
    (2) 减少类名的冲突问题,这也与文件夹类似,同一文件夹中的文件不能重名,不同文件中的文件可以重名,同一包中的类名不能重复,不同包中的类名可以重复;
    (3) 对包中的类起了一定的保护作用,详见java的访问控制;


4、 import的使用
(1) 直接引用指定的类,如import java.util.Vector;
(2) 引用一个包中的多个类,如import java.awt.*。更确切的说,它并不是引用java.awt中的所有类,而只引用定义为public的类,并且只引用被代码引用的类,所以这种引用方法并不会降低程序的性能;
(3) *号代替类名,在不能代替包名,如import java.awt.*,只引用java.awt下的类,而不引用java.awt下的包;
(4) import java.awt.F*,这种使用方法是错误的;
(5) import语句在所有类定义之前,在package定义之后;
(6) import只告诉编译器及解释器哪里可以找到类、变量、方法的定义,而并没有将这些定义引入代码中;


5、包中类的使用
有以下几种机制可以使用包中的类:
(1) 如果要使用的类是属于java.lang包的,那么可以直接使用类名来引用指定的类,而不需要加上包名,因为包java.lang不用显示使用import,它是缺省引入的;
(2) 如果要使用的类在其它包(java.lang除外)中,那么可以通过包名加上类名来引用该类,如java.awt.Font
(3) 对于经常要使用的类(该类在其它包中),那么最好使用import引用指定的包,如java.awt.*
(4) 如果import引入的不同的包中包含有相同的类名,那么这些类的使用必须加上包名
(5) 接口也可以属于某个包,也可以使用import引入其它包中的类和接口






  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值