Java4Android自学记录(19):包和访问权限

突然发现一点,java 程序中貌似只有以 .java 为后缀的文件,而 C++ 中有 .cpp 和 .h 文件。

1 目录及资源索引

  Java4Android自学过程目录及资源索引

2 参考资料

  参考网址:菜鸟教程 - Java 包

3 什么是包

3.1 概念及理解

  通俗的理解,软件包,就是里边存放不同类的文件夹。主要作用就是,在不同的文件夹内,可以存放名字相同的类,从而避免同名类造成的冲突。

  用于区别类名的命名空间。

3.2 包的作用

  查阅资料,总结如下:

  • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  • 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
  • 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

  类似我们在编写一个类,需要调用其他类时,要在文件开头包含(import)对应类所在的软件包。

3.3 如何创建包

  在文件开头使用 package 关键字,再加上对应的包名即可。注意:包名可以是多级目录。

package com.zhao.person

  上述代码会先创建一个 com 文件夹,在此目录下有 zhao 文件夹,然后才是 person 文件夹,在这个文件夹中,才有我们要找的类;

3.4 包的命名方式

  这个只是一般情况下的命名要求,为的是统一风格,简洁美观,通俗易懂。

  • 要求包名所有的字母都要小写;
  • 包名一般情况下,是你的域名倒过来写;(类比网站)

  注意:包名中一旦加上 “.” ,就会发生变化,目录会变成递增的。

3.5 小结

  • 这种感觉就像C++中,类名::函数名一样,如果java中有对应的软件包,那么一个类的全名应该是“包名” + “类名”。
  • 软件包为 Java 类提供了命名空间;
  • 打包需要使用 package 指令;
  • 不同的类,在不同的命名空间中是可以重名的。

4 访问权限

  访问权限从总体上可以分为四大类,如下:

  1. public:公共权限
  2. private:私有权限
  3. default:包级别访问权限
  4. protected:受保护权限

  个人感觉,跟C++中的权限大同小异,但是C++是修饰类中的成员变量或成员函数的,不像这个修饰的是软件包。

4.1 Public权限

  public 英文翻译过来就是 公共的、公众的。从字面意思就很好理解啦。

  • 既可以修饰类,又可以修饰成员变量,成员函数;
  • 原来只是要求尽量的把类名和文件名写一样,方便调试;但是如果变成公共的类(public修饰),则类名和文件名必须完全一样;
  • 如果两个类分别在两个不同的包中,类A如果不是公共的(public),则类B是找不到类A的,自然也就无法使用;
  • 在不同的包当中,一个类要想访问另一个类,这个类要有public权限;要访问成员函数或成员变量的话,则成员变量或成员函数也需要有 public 权限。

4.2 Private权限

  private 英文翻译过来就是 私有的、私自的、自用的。同样的从字面意思就很好理解啦。

  • 不管这两个包,在不在同一个包中,如果是 private ,则只能在这个类当中使用。

  也就是,如果一个类/一个成员变量/一个成员函数是 private 私有权限,则只能在此类中使用。

4.3 Default权限

  这个刚上来我也有点蒙逼,根本没见过这个是什么权限。其实前边什么都不写,就默认是 default 权限,其实从英文翻译过来也不难理解啦,这个单词就是 默认、预设、预置的意思啦。

  • 如果 两个类在同一个包中,那么可以任意的使用,没有问题。
  • 如果类前边什么都不写,成员函数,成员变量也一样。
  • 如果不在同一个包中,则在使用的时候,必须加上包名。

4.4 Protected权限

  顾名思义,这个单词是 保护的意思。那究竟是来保护什么的呢?
  看如下两段代码,子类 Student 继承父类 Person ,父类是 public 权限,但是其中的两个变量是默认(default)权限,且这两个类,不在同一个包中,首先父类代码如下:
在这里插入图片描述
  子类中调用父类成员变量如下:
在这里插入图片描述
  结果编译出现如下错误,提示没有权限?
在这里插入图片描述
  那是不是意味着:如果子类和父类不在同一个包当中,则子类无法继承到父类当中的 default 权限的成员变量和成员函数。
  回顾刚刚的错误,只是说不是公共的,无法从其他包访问。如果是没有继承到 name 的话,则报出来的错误应该是找不到 name 这个变量。也就是说权限不对,不能使用。
  因此:子类可以继承到,但是由于权限问题,所以在子类中无法使用,而不是没有。这个是很关键的,不是没有,而是有,但是由于权限问题,用不了。

  修改之前描述:如果子类和父类不在同一个包当中,子类可以继承到父类当中的 default 权限的成员变量和成员函数,但是由于权限不够,无法使用。

  那么问题来了,如何在不同包的情况下,让继承的子类也能使用父类的变量呢?当然,定义成 public 权限,是肯定没问题的,除此之外,还可以使用 protected 权限。

  • protected 拥有和 default 一样的功能,但是该权限只能修饰 成员变量和成员函数;
  • protected 权限还允许夸包继承。

  到这里就基本清楚了,protected 就是为了保护子类的!

4.4 小结

  • public:可以修饰类,成员变量和成员函数;没有任何限制,同一个包当中,或者不同包当中的类都可以自由访问。
  • private:可以修饰成员变量和成员函数;只能在本类当中使用。
  • default:(不写权限修饰符,就是default权限)可以修饰类,成员变量和成员函数;在同一个包当中,可以自由访问。

4.4.1 public 与 default 的区别

  看上边的小结,发现 public 与 default 貌似没啥区别啊,然后去百度了一下,参考区别
  大概意思就是 public 可以被其他所有类访问;但是 default 只针对同一包中的类。

4.4.2 public 与 protected 的区别

  如果把变量声明为 public ,则在此类外部,都可以使用这个变量;
  而 protected ,则只有这个类的子类,才可以使用这个变量。

4.4.3 几种权限排序

public > protected > default > private

5 包的导入问题

  直接在文件开头使用 import 关键字即可,如果想导入某一个包中的所有类,则可以考虑使用通配符“*”

import com.zhao.*

6 总结

  • 一个类和一个成员变量或成员函数的权限应该尽可能得小,这样才能体现面向对象程序的封装性;
  • 了解了包和基本的四种访问权限,及各自不同的用法与区别;
  • 了解了包的使用,创建方法;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章