java访问权限的作用:便于类库的开发者对类进行修改和改进,并确保不会对类的消费者造成影响。例如将一些方法的属性设置为private的,当类库开发者更改该方法的实现方式时,对类的消费者来说是没有影响的,因为没有消费者能调用那个方法。
包的概念:java引入包机制是为了构建一个内聚的类库单元,便于类的管理以及防止和其它同名类的冲突。
1.package关键字:将类置于指定的包内,该句必须是文件中非注释以外的第一句程序代码。
package com.uestc.www;//将类置于com.uestc.www包内
注:当使用命令模式编译和运行java程序时,打包须知:
package com.uestc.www;
public class Abc {
}//该源程序位于F:\java_practice\csdn
第一句会在当前路径下生成class文件,而第二句会以当前路径为根路径生成com\uestc\www形式的包,并将编译得到的class文件置于其中。
2.import关键字:导入某个包中的类。
import com.uestc.www.Abc;//导入com.uestc.www包内的Abc类
import com.uestc.www.*;//导入com.uestc.www包内的所有类
四种访问权限:
1.public:只能修饰类、方法(含构造方法)、成员变量。其修饰的部分所有人都能访问;
2.默认修饰符(friendly):只能修饰类、方法(含构造方法)、成员变量。其修饰的部分只有同一包内的类能访问,对于这个包之外的所有类,这个成员是private的;
3.private:只能修饰方法(含构造方法)、成员变量。其修饰的部分只能在自身类中访问。例如将某类的构造方法设置为private,那么在其它类中就不能调用“new”来创建该类的实例,通常在该类中会对外提供一种方法,该方法能返回该类的实例;再例如我们经常将成员变量设置为private的,对外提供set/get方法对其进行访问,在set/get方法中可做一些比如权限检测等操作,而不是将域直接暴露给所有用户;
4.protected:只能修饰方法(含构造方法)、成员变量。
- 在同一包中具有包访问权限,相当于默认访问权限;
- 在不同包内:访问权限赋予派生类(继承树的第一个子类—–导出类)
1.在子类中,可继承不同包内父类的protected方法和属性,也只能在该子类中访问(除非重写方法或属性)
package com.scu.www;
public class Son {
protected static int age = 20;
protected void say() {
System.out.println("I am a son");
}
}
package com.uestc.www;
import com.scu.www.*;
public class ProtectedTest extends Son{
public static void main(String[] args) {
Son s = new Son();
s.say();//(错)不能在不同包内用父类对象引用调用其protected方法和属性;
System.out.println(s.age);//(对)成员变量age是static的,子类和父类拥有的是同一份存储空间,因此可以访问;
ProtectedTest pt = new ProtectedTest();
pt.say();//(对)子类可以继承并访问不同包内父类的protected方法和属性;
}
public void tell() {
super.say();//(对)在包外子类中可以用super访问父类的protected方法和属性;
}
}
2.若将子类构造器用protected修饰,则在不同包内是不允许用“new”来创造对象实例的,因为其构造方法是protected的,只允许创造其子类的实例;(类的构造器不能通过继承而得到,没指明的话就是默认构造器,在创造实例时会隐式调用“super.构造方法”)