[疯狂Java]面向对象:封装(JavaBean)、包(package)、import(导入和静态导入)

1. 封装的关键——访问控制符:

    1) Java有4种访问控制级别,范围从小到大(从严到宽)依次为:private、default(包)、protected、public

    2) 4中访问控制符的限定范围:

         i. public:最宽松,对于一切都是可以访问的;

         ii. private:最严,只有在当前类中可见,类外的一切都不可见(都无法访问),包括子类、外部类等一切都无法访问;

         iii. default:包访问权限(什么控制符都不加默认就是包访问权限),即默认的访问权限,它对于包内是public,即包内的其它一切都能访问它,对于包外是不可见的;

         iv. protected:子类访问权限,比default范围大一些(包含default),即包内是public的,而包外,只有其子类才能访问它(即包内public、包外只有对其子类public),使用protected通常是为了以后有子类继承它;

    3) 上述4中访问控制符都可以用于类的成员,而只有public和default才能用于外部类,外部类不能定义为private和protected,因为没有任何意义,例如对于private,类就是让人用的,如果定义为private那这个类就无法被人使用了,也就失去了任何意义,因此如果将外部类定义为private或者protected都将编译不通过;

    4) 一个Java源文件中最多只能有一个public的外部类:因为Java规定

         i. 如果.java中一个public的外部类都没有那么该.java文件的名称可以任意取;

         ii. 如果.java中有一个public的外部类,那么该.java文件的名称就必须跟该类的名称一样(大小写敏感!);

!!所以一个.java中最多只能有一个public的外部类;

!!可以看到Java的语法规则相当严谨,保证了程序的健壮性;


2. JavaBean:

    1) JavaBean是一种规范,它规定了一种良好封装的规范,只要符合该规范的类都称作JavaBean;

    2) JavaBean规范:

         i. 每个数据成员(对象成员)都必须是private的;

         ii. 为每个对象数据成员都提供public的setter和getter;

         iii. setter和getter的原型必须为:

              a. public void set成员名(成员类型 arg);

              b. public 成员类型 get成员名();

!例如,成员private String name;的getter和setter应该是:

    *1. public void setName(String name);

    *2. public String getName();

!!getter和setter主要是为了保证对象数据的安全性,防止错误地修改(可以在setter中加入控制逻辑防止错误修改);


3. 选择何种访问控制符的基本原则:

    1) public:希望暴露给外界自由使用的接口式方法使用public修饰;

    2) private:一般数据成员都应该定义成private,防止外部自由访问,只能通过成员方法操作它;

    3) protected:就是为了继承而使用的,希望子类覆盖的方法用protected修饰;

    4) default:用于包中的各类间协同工作,但又不希望包外使用它;


4. 包——package:

    1) 为了解决命名冲突,和C++使用命名空间不一样的是,Java使用包来管理类库;

    2) 只要在.java源文件的第一个非注释行放置代码:package 包名;

!!这就把该源文件下的所有类都归到该包中了,其中package是关键字,专门用于定义包;

!!package语句一个源文件中最多只能有一句;

    3) 包名的命名规范:

         i. 应该全部是小写字母;

         ii. 用多个有意义的单词用.连缀而成,中间不要有其它分隔符;

         iii. 例如:package com.lirx;    // 该包就是com.lirx

    4) 完整的类名:

         i. 一个类的完整类名应该是包括包路径在内的;

         ii. 例如:类Person位于包com.lirx下,那么Person的完整类名应该是com.lirx.Person;

         iii. 在任何地方都可以使用类的完整类名(包路径)来表示该类;

         iv. 一个类所在的包就相当于该类的命名空间了,就是用来防止命名冲突的;

    5) javac自动产生包目录结构:

         i. 使用javac -d dir Xxx.java后会直接在dir目录下产生和package定义的包路径一样的文件结构;-d指定编译生成的字节码应该放在哪个目录下!

         ii. 例如上面的com.lirx.Person的源文件使用javac -d . Person.java编译后,会在当前目录下生成一个/com/lirx/Person.class的目录结构;

         iii. Java规定:位于包中的类,在文件系统中也必须与包层次结构相同的目录结构!

              a. 原因很简单,因为Java程序就是一个个类,一般一个源文件就代表一个类,在程序中需要用包路径来防止命名冲突,那么在文件系统中同样为了防止命名冲突,使用目录结构就再合适不过了,因此两者统一起来了;

              b. 并且Java还规定,如果.class在文件系统中的目录结构和package定义的不符,那就无法在程序中使用这个类!!使用时运行时无法通过,表示找不到该类,也就是说文件目录结构必须和package定义的包路径完全相符才能正常使用程序!!!!

              c. 其实javac的-d选项除了可以指定生成项目所在的目录之外还有另一个功能,就是自动根据package语句生成相应的包目录结构!如果没有-d选项则不会生成宝目录结构,这样的类将无法使用,除非自己手动检录目录来符合package定义的包目录结构才行!

!!因此一个良好的习惯就是使用-d选项来编译Java源文件!

          iv. 注意package的包路径和文件系统的包目录结构之间的关系:

               a. 是现有package定义的包路径才有包目录结构的!!

               b. 即包目录结构必须符合包路径才行!!

               c. 并不是你先建立包目录结构包路径才生效的!加入你先建立了一个目录结构:com/lirx/Person.class,而编译时Person.java中并没有package语句,那么Person的完整类名就是Person而不是com.lirx.Person,包路径始终是由package语句定义的!

    6) 使用Java运行带有包路径的类:

         i. 必须在包路径的根目录下使用命令"java 包路径名"才行;

         ii. 例如:包路径(目录结构)为dir/com/lirx/Person.class,其包路径名为com.lirx.Person,那么就必须在dir目录下使用命令java com/lirx/Person才行!!

         iii. 不能在其它目录下运行该命令,也不允许直接java Person,必须要有完整的包路径!


5. 用包来管理项目:

    1) 包除了可以防止命名冲突外还可以进行项目管理;

    2) 由于包本身即是一种树状结构(目录结构),因此具有天然地项目管理的优势;

    3) 包的标准的命名规范:公司域名的倒写.项目名.模块名.组件名

!!由于软件公司众多,即是包路径很长也很难保证命名不会冲突,但是网站域名绝对是唯一的,因此用域名的倒写能保证命名绝对不会发生任何冲突!!!

    4) 例如一个完整的包路径类名:com.lirx.ebay.submit.hint.Toolbar

!!其中com.lirx是公司域名的倒写,ebay表示一个电子购物网站的项目,submit表示网站的提交模块,hint表示提交模块中的一个自动提示组件(也是一个包),而Toolbar.class就是组件中的一个类,表示工具栏这个类;


6. 在同一个包中可以省略包路径,在不同包中必须使用完整的包路径:

    1) 包路径一般都很长,每次使用类名都写完整的包路径将会是一件非常麻烦的事,而且代码显得非常臃肿;

    2) Java允许在同一个包中使用包中类可以省略包路径而直接使用类名!!

    3) 但是要注意的是!这个规则不包括具有父子关系的包结构!

         i. 例如包A包含包B,那么在包A的某个类中使用包B的某个类还是必须的用完整的路径名而不能省略包路径!!

         ii. 因为虽然目录结构上具有父子关系,但它们仍然是两个不同的包!!

         iii. 因此,只要是不同的包就必须用完整的包路径!!!


7. 使用import导入包:

    1) 包内的类使用时可以省略包路径,而包外的类想省略包路径就必须使用import语句来导入包了;

    2) import语句必须位于package语句之后和类定义之前!

    3) 导入语法:

         i. 导入单个类:import 类的完整包路径;   // 例如import java.util.Date;

         ii. 导入包中的全部类:import 包名.*;  // *表示通配符,表示包下的所有类

!!注意!*只能表示所有类,但并不能代表子包!!*并不能同时导入子包中的所有类!!

    4) 使用被导入的类时可以省略包路径,直接使用类名就行了;

    5) 极端情况:例如java.util包中有个Date,而java.sql包中也有个Date,现在这两个类都要使用,即使import了也无法省略包路径了,因为一个Date是无法判断出使用的是哪个包下的,因此在这种情况下就不能省略包路径了;

    6) 静态导入:

         i. 在JDK 1.5后允许导入类的静态成员和方法了,语法是:import static 导入内容;

         ii. 不带static的import只能导入类的对象部分,不能导入静态成员,如果想使用类的静态成员时省略包路径就必须使用import static导入;

         iii. 导入语法:

              a. 导入某一个具体的静态成员:import static 包路径.成员名;   // 成员可以是静态变量也可以是静态方法(方法就只要写个方法名就行了)

!!例如:import static java.utils.sort;  // 就只导入了utils的静态方法sort

              b. 导入一个类的所有静态成员(同时包括变量和方法):import static 包路径.*;

!!同样*表示一个包中的所有静态成员,并不能代表其子包!!

          iv. 典型应用:import static System.*;   // 然后既可以直接在程序中写out.println(..)之类的了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值