Scala08_面向对象基础03_访问权限(理解继承关系)

类的访问权限

  • 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) 明确方法提供者和调用者的关系

  1. clone()是Object类的protected方法
  2. 调用者和提供者不是同包、同类,那么就要判断是不是父子类
    由于从编译报错来看,不能调用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的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值