Java面向对象:封装特性的学习
Posted 牛牛要坚持
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面向对象:封装特性的学习相关的知识,希望对你有一定的参考价值。
本篇文章接受了Java面向对象的封装特性,什么是封装,封装的体现,Java四种访问权限修饰符的介绍
介绍了Java中的包,什么是包,如何导入包中的类,包的访问权限以及认识Java内常见的包
Java面向对象封装特性
一.认识面向对象特性: 封装
面向对象程序设计有三大特性,在类和对象阶段.第一个要掌握的是封装,而何为封装,一句话来讲就是套壳屏蔽细节…
1.什么是封装?
封装: 将数据和操作数据的方法进行有机结合, 隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。使用者只能通过公开的接口和对象进行交互操作
比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。
因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
此时用户不需要直接面对CPU这些复杂的内部元器件,通过提供的外部接口操作电脑使内部元器件工作,使操作简洁化,也避免了对元器件在外部暴露,提高了安全性
2.Java内封装的体现
在Java中,用类就可以将数据和操作数据的方式进行有机结合,即里面可以存放成员属性和成员方法,更符合人类对事物的认知
而在Java里还可以使用四种访问权限修饰符用来控制属性和方法的访问级别,即属性和行为是否能在类外部以及包外部直接被访问…
3.Java四种访问权限修饰符
private
private(私有的): 在类中当被private修饰的成员变量和方法,表示其只能在当前类内被访问! 在其他类里是无法直接访问的, 被private修饰后一般都要提供供外部直接访问或间接访问的交互接口来实现在外部访问! 比如:get set 方法
default
default(默认的): 在类中的成员变量方法左边不写权限修饰符就是default权限,表示其只能在当前包内使用,何为包在下面会介绍… 在一个包里的所有类内都能被访问,对立的在其他包内所有类都无法直接访问 一般用于只想当前类内被访问时使用,但也可以提供交互接口使其在包外也能被访问
default也能修饰一个类,即在一个文件里只有一个被public修饰的类其他的类都不需要写权限修饰符表示为default修饰的类即包访问权限的类
protected
protected(被保护的) 在类中使用这个权限修饰符修饰的,在同一个包中任意类都能被访问到,访问限制权限主要作用于在不同包中, 在一个包中的类内要想访问到其他包中的被protected修饰的属性或行为,
这个想访问的类必须是被protected修饰的属性或行为所在类的子类 且必须得在当前子类内才能访问,在其他非子类是无法访问的
protected用于在不同包里的父子类关系中使用的权限修饰,需要掌握继承才能进一步使用
public
public(公有的)在类中被public修饰的属性或方法,不管在同一个包中,还是不同包中的所有类内都可以访问到被其修饰的属性或方法,这个权限是最大的最广泛的… public也可以修饰类表示为主类,一个文件里只能有一个被public修饰的主类,其他的都是没有修饰符的default默认权限类
此权限也是为提供给外部交互访问的接口方法需要用到的修饰符,搭配private使用,通过调用public修饰的方法到其类内访问被private修饰的属性或方法
public:可以理解为一个人的外貌特征,谁都可以看得到
protected:只要有着父子类关系,在子类我就能够访问到父类的东西,相当于父亲的遗产可以给同家族的人(一个包)也可以给离开家族的儿子,其他没关系的都无法得知…default: 对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了 private:只有自己知道,其他人都不知道
权限范围 :private<default<protected<public
范围(是否能被访问) | private | default | protected | public |
---|---|---|---|---|
同一包中同一类内 | √ | √ | √ | √ |
同一包中不同类内 | √ | √ | √ | |
不同包中子类内 | √ | √ | ||
不同包中非子类 | √ |
注意:
1.default权限并不需要default修饰符,只是表示默认的意思,什么修饰符都不写即是default权限
2.访问权限除了可以限定类中成员的可见性,也可以控制类的可见性,public修饰的主类一个文件只能有一个和default权限的类可以有多个
3.一般情况下成员变量设置为private,成员方法设置为public(体现封装性)
4.构造方法也是成员方法也能被权限符修饰
二.封装拓展:Java中的包
上面四种访问权限修饰符都涉及了包这个概念,在Java要学好面向对象封装特性,得了解包这个概念
1.什么是包?
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
有点类似于目录文件夹。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
在Java中可以说一个程序就是有多个类组成,而每个类之间也存在一定的联系,
比如写一个五子棋程序,我们需要写棋盘类,规则类,棋子类,甚至棋手类
而这些类代表着不同属性的对象,如果我们统一写在一个文件下,以后需要维护,修改,功能拓展等就会变得很麻烦
而包就相当于是多个相同属性类的集合,同一属性的类放在一个包下,也就是分组管理,使得日后维护起来更方便
如:不管什么棋子类都放在棋子包里,棋盘类放在棋盘包里
在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,
比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可
注意:
包可以看成是文件夹,类可以看成是一个个文件,也就是包里可以有子包,也可以有类,不同级别的包内都是不同的空间都可以存在同名的类
2.如何导入包中的类?
在Java中提供了很多现成的类包给我们使用.比如:
在写Java代码时,会用到Scanner类,此类就是在Java.util 工具包里的一个类
1.当我们需要使用这个类时,需要在前面加上类的全路径,即这个类是属于哪个包下,此时编译器才会根据你提供的包里去包里面导入这个类使用
示例:
Java.util.Scanner=new Java.util.Scanner(System.in);
//要使用java包里的工具包内的Scanner类就要在前面加上其所在的包名
上面这种导入类的方法需要知道要使用的类在什么包底下并且每次要使用这个类时都需要在前面加上其包路径,会有点麻烦
2.使用关键字导包
在Java中有个关键字import,需要使用哪个类,只需要在代码首行用import 加上包路径.类名; 导一次类包即可,在后续就可以直接使用类名前面不用再加上包路径
示例:
import Java.util.Scanner;//导入java包里的util工具包里的Scanner类
Scanner scanner=new Scanner(System.in); //直接使用类名
3.如果我们想导入一个包里面的多个类使用时,就要每导入一个类要写一个import,也可以有更简便的写法
import Java.util.*; //编译器会根据你使用的util包里的类来导对应的类
上面这种写法 *表示通配符所有的意思, 就是导入在util包下 的所有类,但是并不会全部导入,而是你用到什么类,编译器会自动帮你导入这个类,没有使用则不会导
注意:这种写法,不建议在需要导多个不同的包底下的类时使用,因为可能会出现不同包有同名类的情况.此时编译器无法判断你要导入哪个包里的类则会报错!!!
4.一些类中有静态成员方法或变量需要类名.方法名或者类名.变量使用,如果不想要每次在前面写类名可以使用import static 加上包路径.类名 导入类中静态的方法和成员
示例:
Arrays.sort();
//↑没使用import static时 需要使用类名.静态方法
import static java.util.Arrays;
sort(); //使用 import static后 不需要类名 直接可以使用方法名调用
注意:
import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容(这是将对应文件的内容做一份拷贝过来),
但是 Java 不需要.import 只是为了写代码的时候更方便(告诉编译器你需要使用某个包下的类). import 更类似于 C++ 的 namespace 和 using
3.如何自定义包?
在用面向对象思想解决问题,我们需要建立不同个类,为了方便管理这些类,需要建立不同对应的包来分组管理这些类
基本规则:
在文件的最上方加上一个 package 语句指定该代码在哪个包中.
包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式:test.study.note1 包名要和代码路径相匹配. 例如创建test.study.note1 的包, 那么会存在一个对应的路径
com/bit/demo1 来存储代码. 如果一个类没有 package 语句, 则该类被放到一个默认包中
package test.study.note1;
// 表示此处类文件是在 java包里的 study包 里的note1包里
这里介绍的是IDEA软件内的自定义包方法
右击src->选择new->单击Package
在窗口中输入包名按回车即可
注意: 名称之间用. 点号分开 可以被识别 能够设置为多级包
如果想设置同级,右击src或者你要在对应的包名称,根据上述操作一一建包
此时即建立了test包 内有study包内有 note1包 即有三层包,
也可以通过单击右上角齿轮 选择对应的显示方式
建立了包后,对应的src文件夹里即有对应包文件夹
========================================
如果想建一个包的同时在包里面同时建一个自定义名称的主类
可以右击 src->new->Java Class
在新建类的名称框中 输入 包名.类名 (此时会建立一个包 里面有一个主类)
注意:
1.在IDEA里,src为默认的包,只能在src里建立类或者建立包
2.不管是同级包,还是多层不同级包,每个包都是一个个体,包里面的类权限就是在当前包下,不管是上下层包里的类 还是同级另一个包里的类 都属于不同包下的类!
3.在建立包时要明确包的名称,在java限定了包名不能取名为java即和java内部提供的包名发生重名,否则会报错
4.包的访问权限
每个包里的类都可以看做是同一个家族
同一个包里的任意类都能互相使用对方,但是如果是不同包里的类如果要互相使用,就要使用上面说的写上对应包的全路径或者用import导入类包…
package test.study.note2; //当前所在的包
import test.study.note1.Test; //导入 对应包下的类
import test.study.note1.Test1;
public class Test3
Test test=new Test();
//test和test1 note1下 而当前test3是在note2包 .
//是在同级不同包下不同类需要import导类包
Test1 test1=new Test1();
============================================
注意:
Java源文件中外部定级类只有public和default两个权限
但是只有一个主类也就是public修饰的类,其可以被任意包下的类使用,如果不同包下的类需要先导类,
但是除了主类以外,再写在一个文件里的其他类就default类型的类也就是包访问权限的类,此类只运行在当前包内被访问,且是在当前包内可以不需要导类,
而在另一个包里哪怕手动导了这个类也是使用不了的!!!
所以建议一个文件里只写一个类 也就是主类!
package test.study.note1;
class Test2 //默认访问权限的类 包访问权限 只能在当前所在的包内被使用 最近一级包note1
//最外部类 顶级类 权限修饰只有 public 和default两种
//一个类文件必须有且仅有一个主类,其他类是默认访问权限的类
//不论外部类权限 每个类里都可以有静态main方法 可以直接编译运行的
public static void main(String[] args)
System.out.println(6);
///
package test.study.note2; //当前所在的包
import test.study.note1.*; //导入 任意类 使用时会根据类名导入
public class Text3
test2 test2=new test2();
//错误 note1包里的test2是test1里的一个默认访问权限的类 只能在note1包下被使用 其他包里的类不能使用 即便导类也无法找到该类
=======================================================
在IDEA中所有类或者包都要建立src文件里,src就是一个默认的包,当我们在src里建立包时,是不会出现package语句(表示当前在哪个包里),
并且当我们在一个建立的包里.需要使用src默认包下的类时,是无法通过import来进行导入类的!!!需要用到一些特殊的方法:反射机制
因此,在写项目时,不建议直接在src下建立类,应该先把对应包建好,做一些小练习时可以直接在src下建立类
package test; //当前在test包内
public class Test
Note note =new Note();
// 编译器报错 无法使用src 默认包下的类 且不能通过import来导入 可以借助反射机制
5.认识Java内常见的包
- java.lang:系统常用基础类(String、Object, Math),此包从JDK1.1后自动导入。
- java.lang.reflect:java 反射编程包;
- java.net:进行网络编程开发包。
- java.sql:进行数据库开发的支持包。
- java.util:是java提供的工具程序包。(集合类等) 非常重要
- java.io:I/O编程开发包
以上是关于Java面向对象:封装特性的学习的主要内容,如果未能解决你的问题,请参考以下文章