类与对象二
在前面类与对象一的章节中我们了解了类与对象的一些基础概念比如类的定义对象的初始化等在类与对象二我们来共同学习更加进阶的概念——包1. 包是什么在大家的第一印象里包是什么是大家常见的钱包书包还是吃的肉包菜包呢1.1 包的概念在面向对象体系中提出了一个软件包的概念即为了更好的管理类把多个类收集在一起成为一组称为软件包可以理解为目录。随着代码编写此处的类越来越多显得有点乱这时候我们将一些有关联的类放在一起装起来这也就形成了包。举个例子大家平时有垃圾分类的习惯吗比如纸类塑料等放在可回收垃圾然后废旧电池过期药品则放在有害垃圾还要剩菜剩饭果皮则放在厨余垃圾。大家可以把需要分类的物品比如塑料果皮想象成类不同的垃圾桶就是不同的包。1.2 如何创建包第一步右键src—点击新建—点击软件包。中文版右键src—点击New—点击Package。英文版第二步随后弹出一个界面让你输名称一般采用小写字母命名。需要注意的是不能以数字开头只能以字母a-z、A-Z或下划线_开头。当创建完毕就能发现src下面多了一个名字为object的包1.3 如何移入包内第一步选中你想要分类的包第二步长按移动把Cat类拖入到object包里面然后会跳出来这样的界面选择这个重构英文版的选择Refactor。第三步在左下角会弹出一个这个对哈框选择执行重构。英文版选择Do Refactor。这样就能够把类移入包内了。然后可以检查一下移入包内的类最上面有没有这一行如果有说明你们也移入对了很棒。1.4 包的一些注意事项1当把某个类移入包中的时候此时idea会自动在类的最上方添加package语句来声明这个类属于哪个包内。2包的名字要符合实际情况名字不一致就会报错。3创建的时候如果object2中只包含一个object3就会直接简化显示。看到这里大家可能以为包跟目录差不多但是有一点需要提醒的是——只包含.java代码的目录才可以视为包。1.5 如何导入包别人使用的代码通常也会使用包组织起来如果想使用别人的代码就需要在你当前的代码中导入对应的包。public class Package { public static void main(String[] args) { java.util.Date date new java.util.Date(); } }这段语句是调用了Java标准库中的Date。可以正常使用但是很麻烦import java.util.Date; public class Package { public static void main(String[] args) { Date date new Date(); } }可以使用import语句简化。import java.util.Date; import java.util.Random; import java.util.Scanner;使用Java标准库的类都是需要import再使用的。不过如果你的开发工具使用的是IDEA的话IDEA在你写代码的时候会自动生成。如果IDEA没有自动生成也可以用今天学到的知识来手动添加。如果是手动写不知道这个包在什么路径就需要查文档了也可以直接问AI特殊情况java.lang这样的包不需要import编译器会自动import引入包不仅能够使类得到整理更加干净整洁可以使当前的名字得到管理避免名字起到冲突我们会写一个Date类别人也会写一个Date类但只要在不同的包内此时这两个类就不会编译出错。如果名字相同此时编译器就无法正确解析了。2. 封装接下来我们认识封装简单来说就是把一些细节隐藏起来简化程序员思考的负担。封装的定义理解起来会比较抽象我打个比喻比如电脑电脑就将内部的CPU显卡等隐藏起来只留有键盘开机键等本来电脑内部有复杂的硬件但是将这些细节隐藏起来使用起来就比较轻松作为使用者不需要知道电脑内部有什么只用知道开机键可以打开电脑。2.1 封装的意义封装在广义上的说法把细节隐藏起来创建方法就是把方法实现的细节隐藏起来创建类就是把类的实现细节隐藏起来实现网络协议也是把下层细节藏起来。也有狭义的说法专门指类这一种情况把类的实现细节隐藏起来。隐藏起来的意思是类中的方法和属性只能在类内部使用外面感知不到。2.2 如何实现封装private修饰的属性和方法就是只能在类内部使用的被封装起来了CPUpublic修饰的属性和方法可以在类外部使用的外面仍然能使用开机键在写类和方法时仍然需要保留一部分内容给外面使用通常的原则哪些属性/方法要private哪些要public取决于实际的代码场景原则上属性都是设置为private方法有些设置为public有些设置为private在考虑用public或者private的时候要思考用户是否应该执行这样的操作如果需要就public不需要就private。依旧用电脑打比方给电脑插入显示器public给电脑更换CPUprivate。想来大部分人在生活中应该没干过更换CPU吧如果想更换一般找电脑硬件相关的人。因为CPU可能一个操作不慎可能就坏了所以要把CPU用外壳给封装起来。而给电脑插显示器则很常见也不容易搞坏所以接口就留在外壳外面。以下行代码和结果给大家展示public class Cat { public String name; //名字 public String kind; //种类 public String color; //颜色在cat类中我将属性设置为public属性public class Package { public static void main(String[] args) { Cat cat new Cat(); System.out.println(cat.name); } }随后在package中创建对象打印cat的名字。可以看到打印出了null一是因为没有给属性就地初始化二是因为属性设置为public可以在类外部使用也就是别的类中使用。public class Cat { private String name; //名字 private String kind; //种类 private String color; //颜色接下来将属性改为private发现编译器直接报错了因为private修饰的属性只能在类内部使用。2.3 小案例有些人可能会有点疑惑全部设置为public不是会很方便吗接下来为大家展示一个案例。public class Cat { public String sex; //性别将性别设置为publicpublic class Package { public static void main(String[] args) { Cat cat new Cat(); cat.sex 霸王龙; System.out.println(cat.sex); } }性别设置为public后在别的类竟然将性别设置为了霸王龙很显然没有这个性别但是却成功打印出来了因此如果将属性设置为public就太“自由”了没有限制很容易出事情。因此需要限制属性设置为private因为设置了private所以我们想要在类外部使用。需要借助getter方法和setter方法public void setSex(boolean isMale){ if(isMale){ sex male; }else{ sex female; } } public String getSex() { return sex; }用set方法输入然后再用get方法输出。public static void main(String[] args) { Cat cat1 new Cat(); cat1.setSex(true); System.out.println(cat1.getSex()); }然后你也可以根据实际需要分析一下某一个属性是否要给外面使用。