类的访问权限
- Java中子类可以继承到父类的私有属性和方法;有没有和能不能访问是两回事;
(1) 如何理解访问权限?
权限 就是服务提供方 对用户所能享受的服务的限制
用户权限越大,能够享受的服务越多;
(2) 程序中如何体现权限?
以方法为例:
程序中访问权限指的是方法的提供者和方法调用者之间的关系
(3) 如何理解方法的调用者和方法的提供者?
1.代码演示现象
public class Scala07_Object_Access_java {
public static void main(String[] args) {
A a = new A();
a.clone(); //编译报错 clone()是Object类中的protected方法
}
}
class A{
}
上面代码中a.clone()编译报错;
2.分析
(1) 明确谁是 方法的提供者 和 谁是方法的调用者
方法的提供者:A类没有重写clone()方法,因此是调用其继承自父类java.lang.Object类
所提供的clone()方法
方法的调用者: Scala07_Object_Access_java类
补充说明:
. 点 不是调用的意思 而是表示从属关系
比如 对象.方法 对象.属性 类.方法
所以这里调用者不是对象a
而是在Scala07_Object_Access_java类中的main方法中调用了对象a的clone方法
(2) 明确方法提供者和调用者的关系
- clone()是Object类的protected方法
- 调用者和提供者不是同包、同类,那么就要判断是不是父子类
由于从编译报错来看,不能调用a的clone(),那么说明不是父子类关系;Object类不是所有类的父类么,为什么不是呢?
(4) 父类 和 父类对象 的区别
原因:
-
张三的父亲 是不是 李四的父亲
张三 有 父亲
李四 有 父亲
但是二者的 父亲对象并不是同一个; -
clone()方法是Object类中提供的成员方法,是非静态的,其实对于重写来说只能是非静态的;那么在上面的代码示例中
方法的提供者来
更准确的说法是A类的父类Object对象
-
因为A类的
父类 Object 对象
和 Scala07_Object_Access_java类的父类Object 对象
并不是同一个;如下图所示
注意并不是下面这种关系:
所以需要搞清楚父类和父类对象:
- A类的父类Object类也的确是Access_Java类的父类;
- 但是A类的父类对象并不是Access_Java类的父类对象
- 由于方法是父类对象提供的,所以这里看的是父类对象是否是同一个!
解决方案:
如果想让演示代码中调用a.clone()编译不报错,就让A类重写clone()方法,此时方法的提供者变为A类,A类和当前类属于同一个包,因此满足访问权限要求,此时可以调用
java中的访问权限
1.private
提供者和调用者在同一个类中才能使用 类私有
2.(default)
提供者和调用者在同一个包中 包私有
3.protected
提供者和调用者在同一个类 or 同一个包 or 父子类关系 受保护的
一般只有父子类中才会用,因为同包同类都已经有访问权限了
4.public
公共的 任意
Scala中的访问权限
1.private
: 类私有 同类中才能访问
2.private[包名]
: 包私有 指定包及其子包中的类才能访问
3.protected
: 受保护权限; 只能同类 和子类访问,同包不能访问
4.(public)
:公共的 默认的,不写就是public的