对四种访问权限的理解
private,默认,protected,public这四种,一个比一个更开放
java中最核心的就是方法,方法是实现目的的最直接手段。无论是自己写的功能方法,还是常见的main,这些方法都是建立在一个类中的,也就是一开始一定要选择一个类去执行代码,在这个类中去展开属性和方法的使用,比如一个单独的.java文件,一定有一个(public)class,里面往往有一个main函数
很多情况下需要在一个类A中去调用另一个类B的属性和方法(初始化函数也是方法),比如下图高亮区域
这里就是在PackageTest1类中的main方法里调用了Animal类的初始化函数和run()方法,调用成功,就叫说Animal的这个方法对PackageTest1可见,不成功就叫不可见(如果报错说run()方法不存在或不能用,则不可见)
成不成功(可见或不可见)取决于这两个类之间的关系以及调用属性或方法的访问权限,访问权限就是那四种,而两个类的关系有这么几种
父类与子类关系:比如Animal类和Cat类
非子类关系:比如PackageTest1类和Animal类,风马牛不相及的两个类,
毫无继承等关系,只是纯粹的需要在包测试类中调用动物类的方法
同包关系:两个类同属于一个包package中
不同包关系:不属于同一个包的两个类,想要在A包中调用B包的类方法,
需要在A包某个.java文件中import packageB才行
最后是分析四种访问权限的分析
首先是private成员,这个成员啥意思呢?就是说在一个类Animal的定义区,会定义若干属性和方法,属性和方法都叫做成员,如果我们在定义类内属性时写private int a=6;那么就为这个类定义了一个私有属性,同理private void run(){}就是一个私有方法
但是注意类class的访问权限关键词只可以是默认或者public
同一类中可见啥意思?以那个私有变量a为例,如果在Animal的定义部分的属性区或方法里需要调用这个a,比如run(){print(’‘speed is’’+a)}那么没关系,尽管用就是了,私有就是说这个属性是类内才能用的。方法也是个到底,可以在类的定义区内的别的方法里调用私有方法。但是一旦出了这个类,比如我现在到了PackageTest1类里去实例化Animal,再调用a属性,那么不行。这个属性私有了,你PacageTest1没法用,只有我Animal类才可以用
同一个包中对子类不可见啥意思?就是说,假如Animal类和Cat extends Animal类都在包creature中,我现在要在Cat类里面去调用Animal私有的属性a和方法run(),那么抱歉,不行,即使你是子类也不让你用,因为这是private权限。
但如果a和run()是用别的三种访问权限修饰的话,同包的子类仍然可以调用,也就是可见
同包对非子类不可见啥意思?就比如PackageTest1类和Animal类,都在example包下,风马牛不相及的两个类,毫无继承等关系,但是我在包测试中定义了一个动物实例,现在想调用实例的a属性和run()方法,却由于他俩是Animal的private属性,失败了
把访问权限换成另外三种,就允许调用。也就是可见了
不同包对子类不可见啥意思?p1包的Animal有个私有属性a和私有方法run(),p2包里class Cat extends Animal{},如果想在Cat中调用属性a和run()就会失败,换成默认权限也会失败
把访问权限换成protected或public就可以成功调用(可见了)
不同包中对非子类不可见啥意思?就是说,p1包的Animal有个私有属性a和私有方法run(),p2包里有一个风马牛不相及PackageTest1类,毫无继承等关系,我现在要在包测试类里面实例化Animal,再调用其属性a和方法run(),报错。即使把a与run()的权限改成默认或protected还是会报错
只有把权限改成public才可以让不同包里毫无关系的两个类的能够互相调用属性和方法