Java 有四个访问权限修饰符,分别是public protected default private
。这些修饰符用来修饰类、属性和方法,一共也就这三种情况。建议在阅读以下内容时,配合 IDE 工具的智能提示进行验证。
疑问:为什么要有访问控制权限这种东西,它能用来干嘛?给个保证安全性的解释就完了???难道这样解释还不够吗?
用来修饰类
- public 修饰的类,表示完全公有的。只要是这个项目下,任何地方的类中都可以使用它,如果在不同包下,使用 import 导入下即可。
- protected 不可以用来修饰外部类,但是在一个类的内部类是可以使用 protected 修饰的,内部类是外部类的一个组成部分,同样可以被它的子类继承。这里新增加的补充内容启示,笔记应该反复查看,曾经的笔记可能有错误或者不完善,后续应该不断的修改,这就是写电子档笔记的好处。
- default 修饰的类,表示在同一个包下的类中都可以使用,但是其他包下的类中无法使用它,因为根本就见不到。
- private 修饰的类,叫做私有类,只有在本类中才可见,其他类无法使用。
用来修饰属性
这里讲的是实例属性,实例属性只能通过对象引用才能够使用。
- public 修饰的属性,表示在这个项目下,任何地方的类中只要持有这个类对象的引用就可以使用它。前提当然是这个类能够访问到对象所属的类,不然怎么可能持有这个对象的引用呢?其他同理!
- protected 修饰的属性,在同一个包下,任何一个类中只要持有这个类的引用就能够使用它。不同包下,即便是继承关系也无法通过这个类对象的引用使用这个属性。但是如果是继承关系,那么这个类中可以通过 this 指针来使用这个属性,这是因为子类继承了父类的属性。这是两个完全不同的概念,不冲突。
- default 修饰的属性,在同一个包下,任何一个类中只要持有这个对象的引用就可以访问它,不同包下尽管持有这个对象的引用也无法使用这个属性,而且即便是继承关系也无法通过 this 指针使用它。
- private 修饰的属性,只能在本类中使用,其他类都无法使用到。
用来修饰方法
这里讲的是实例方法,实例方法只能通过对象引用才能够使用。
- public 修饰的方法,表示在这个项目下,任何一个类中只要持有这个类对象的引用就可以使用这个方法。
- protected 修饰的方法,在同一个包下,任何一个类中只要持有这个类对象的引用来使用它。但是在不同包下,即使是继承关系也无法通过这个类对象的引用使用它。但是在这个类中可以通过 this 指针使用这个方法,这是因为子类继承了父类的方法。对于 JDK 中提供的类也是同样成立的,废话,JDK 提供的类就能够特殊对待吗?比如 Object 类有一个
protected void finalize()throws Throwable
方法就是 protected 修饰的,任何对象都是无法通过引用来调用这个方法的,只能在类的内部通过 this 指针调用。 - default 修饰的方法,在同一个包下,任何一个类中只要持有这个类对象的引用就可以使用它。在不同包下,即使是继承关系也无法通过这个类对象的引用使用它。而且即便是继承关系也无法通过 this 指针使用它,但是同一个包下的继承关系还是可以通过 this 指针使用它的。这说明是因为不同包下导致访问权限的问题,而不是不同包下就继承不到了。
- private 修饰的方法,只能在本类中使用,其他类中都无法使用到。
总结:
实例属性、实例方法都是依赖于具体对象的,所以不能脱离对象来谈访问权限。Java 中任何代码都是在类中的,所以也不能脱离类来谈访问权限。因此,在谈论访问权限的过程中,首先要明确是在哪个类中,其次要明确这是通过类对象的引用来使用的方法或属性。
包真的是一个分水岭啊。同一个包下无论是 protected 还是 default 都可以通过类对象的引用访问属性和方法,但是在不同的包下是不可能访问得到的。而且,对于继承也是如此,同一个包下子类可以通过 this 就能够访问到protected 和 default 修饰的属性和方法,但是在不同包下,子类只能访问到 protected 修饰的属性和方法,default 修饰的也不行。
public 和 private 都没有问题,很清晰明了。唯独 protected 和 default 修饰的属性和方法有点绕,以前好像一直没深究过这个问题,这块都不清楚。这次弄清楚了,也不知道什么时候会忘记,什么时候又能够用得上呢。
正常情况下,大部分都是采用 public 和 private 配合使用,default 和 protected 用的好像并不多诶,以后慢慢积累它的使用场景。