java面向对象的基本思想之一是封装细节并且公开接口。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节。访问控制分为四种级别:
(1)public: 用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问;
(2)protected: 用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问(包外的子类可以用Super来访问),protected重点突出继承;
(3)default: 如果一个类、类属变量及方法没有用任何修饰符(即没有用public、protected及private中任何一种修饰),则其访问权限为default(默认访问权限)。默认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default重点突出包;
(4)private: 用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它。
(1)适用范围<访问权限范围越小,安全性越高>,如图所示:
(2)类的修饰符:public:主类。 一个文件中只能有一个主类。 主类整个项目下都可以使用。
default:其他类。不能跨包使用。
成员(变量和方法 ,本包可以使用。成员变量成员方法):public protected default private
public:在整个项目下都可以使用。
default:在本包内可以使用,不能跨包。
private:只有本类可以使用。其他类都不能使用。
protected:不能跨包,但是跨包类如果是该类的子类,就可以用。用super来访问父类的成员
构造方法:
public protected default private和成员的使用是一样的,没有任何区别。
例:
package com.fs.test;
import com.fs.TestAccess02;
/*为什么protected修饰的成员变量hight 可以在B类使用 A类就不行、
*
* 因为protected修饰的关键字,虽然不能跨包使用。但是可以在子类中使用。
*
* */
public class A {
public static void main(String[] args) {
//Test1是public修饰的类,是可以跨包使用的。
TestAccess02 t =new TestAccess02();
//default修饰的类,在其他包中不能使用。
// T t2 =new T();
//public修饰的成员变量age 是可以跨包使用的。
System.out.println(t.age);
//default修饰的成员变量name。 不可以跨包使用
// System.out.println(t.name);
//protected修饰的成员变量hight 不能跨包使用。
// System.out.println(t.hight);
}
}
class B extends TestAccess02{
public void method(){
//protected修饰的成员变量hight 可以在不同包子类中使用。
System.out.println(super.hight);
}
}
TestAccess02位于:package com.fs
A位于:package com.fs.test
B 位于:package com.fs.test,但是却是TestAccess02的子类
结论:protected修饰符所修饰的类(这句话中指父类)属成员变量和方法,只可以被子类访问,而不管子类是不是和父类位于同一个包中。default修饰符所修饰的类属成员变量和方法,只可被同一个包中的其他类访问,而不管其他类是不是该类的子类。protected属于子类限制修饰符,而default属于包限制修饰符。