‫欢迎回来｡
‫在本视频中, 我将向您展示属性并教您属性如何工作｡
‫因为一个视频会太长, 我在过去创建了一个关于属性的视频, 它看起来有点太混乱了｡
‫我决定把它分解并重新录制, 因为它看起来还不够好｡
‫所以, 如果你发现另一个视频是完全混乱的, 它不会帮助你在所有｡
‫那么请让我知道, 因为我希望这门课是最好的课程｡
‫好吧, 我会的
‫所以我们需要做的是, 首先, 创建一个新类｡
‫让我们转到project, 添加一个新的类, 因为我想教你们属性的基础知识, 因为它们是一个重要的方面,
‫或者说是一个重要的概念, 我们会经常用到｡
‫这就是为什么你要理解它的整个广度是非常重要的｡
‫我们先创建一个新类, 我把这个类命名为类盒.
‫好吗？
‫所以只是非常简单的类｡
‫所以这个盒子类就是一个有一定数量变量的类.
‫好吧, 我会的
‫比如说, 我们只想根据盒子的长度, 高度和宽度来计算它的体积｡
‫好吧, 我会的
‫我们先创建这些变量, 然后把它们设为公共变量.
‫好吗？
‫我将把这一个长度设为公共长度, 然后是另一个, 这个是高度, 然后我们需要宽度｡
‫最后, 我想也有体积｡
‫所以体积将是这个盒子的最终结果｡
‫好吧, 我会的
‫所以现在我有一堆变量｡
‫这些变量不是简单的变量
‫事实上, 它们是成员变量, 这意味着它们是类级别上的变量,
‫在本例中是类框｡
‫所以可以说, 它们直接影响着盒子的整体外观, 或者说盒子的整体结构｡
‫好吧, 我会的
‫我们将看到如何以不同的方式使用成员变量, 甚至是不同的结构, 这样更安全｡
‫因为这里的问题是, 它们是公共的, 所以它们不安全｡
‫我们将看看如何解决这个问题｡
‫首先, 我们在这里创建一个新方法｡
‫我把这个叫做“显示信息”, 因为它只显示长度､
‫宽度和高度, 然后计算体积, 告诉我们体积有多大｡
‫好吧, 我会的
‫我只想写一个简短的右行语句｡
‫所以我输入CW double tab, 它在这里为我创建了这个控制台右行语句｡
‫在这里, 我会把长度作为第一项, 高度作为第二项.
‫所以我这样使用它, 第三个条目是｡
‫所以体积是, 然后我有第四个条目｡
‫好了, 这是我的整个右行语句, 然后我要使用的变量是长度, 高度｡
‫有了｡
‫和音量｡
‫现在, 体积是我需要根据长度､ 高度和宽度计算出来的东西｡
‫所以我就这么做了｡
‫我只想说体积是长度乘以高度乘以宽度｡
‫执行此操作将创建此体积或计算体积, 因为体积是此处计算的结果｡
‫长度, 时间, 边时间, 宽度, 这将是体积｡
‫好吧, 我会的
‫现在让我把它分成几行, 这样可读性更强.
‫好吧, 我会的
‫现在我们有了这个方法来显示信息｡
‫现在, 让我们继续保存此文件, 然后转到我们的程序密钥｡
‫在这里, 我们将使用这个类｡
‫我们要创建一个这个类的对象｡
‫我们如何创建对象？
‫好吧, 我知道了
‫所以我创建了它的一个新对象｡
‫我将调用这个盒子, 它将是一个新盒子.
‫这就是创建类的对象或类的实例的方法｡
‫所以我创建了这个类盒的一个实例｡
‫所以基本上一个类型为box和box的变量是我们自己创建的｡
‫现在我能做的就是给它赋值, 这样我就可以继续说,
‫好的, 长度是3, 然后高度是4, 宽度是5, 类似这样｡
‫当然, 我还需要一个等号, 这样才能使代码正确｡
‫现在, 我能做的就是调用box.dot｡
‫显示信息
‫所以这很酷｡
‫我不需要再用这种明线声明了｡
‫现在我可以保存并执行该文件｡
‫因此, 让我们运行此文件, 它将在控制台中显示信息｡
‫所以我们长度是自由的, 高度是4, 宽度是5, 所以体积是60｡
‫好吧, 我会的
‫原来如此｡
‫那太好了｡
‫因此, 这个显示信息工作了, 它只是显示我们想要的细节｡
‫现在我们要做的就是改变盒子类的成员变量的值.
‫我们可以这样做, 因为它们是公开的｡
‫对不对？
‫所以这个是公开的｡
‫这个是公开的｡
‫这个也是公开的｡
‫所以它们都是公开的｡
‫现在, 这是非常不安全的代码, 因为在这一点上, 如果你写的成员标签是完全公开的,
‫每个人都可以在任何时候更改它们｡
‫所以每个可以创建对象的人或者每个可以创建box对象的类, 我们都可以改变box实例的所有值｡
‫所以每个人都可以访问这个盒子现在可以改变它｡
‫这会导致很多问题｡
‫再往前走, 当你编程和一个团队之类的时候, 这样做真的会变得很麻烦｡
‫所以还有更好的办法｡
‫有更简单的方法来实现它, 因为你可能不想长度是可调的, 你可能想让长度有一个特定的值.
‫没有人能调整它｡
‫然后你可以做这个｡
‫口头私处｡
‫所以我的成员变量length是私有的, 我只给它赋一个默认值3.
‫所以现在我创建的每个长方体的长度都是3｡
‫所以每个盒子的长度都是3英寸或者3米或者你用的任何度量标准｡
‫所以现在我不能再指定长度了｡
‫所以你看, 我在这里得到了一个错误｡
‫由于其保护级别, 无法访问框长度｡
‫因此, 我们通过将其设为私有来增加保护级别｡
‫所以现在我们不能再调整了｡
‫那我们还能怎么改变它呢？
‫我们不能｡
‫不是说我们在这边｡
‫所以我们需要实施一些东西｡
‫我们需要实现另一种方法来更改长方体的长度｡
‫好吧, 我会的
‫为了做到这一点, 我们可以实现setter和getter｡
‫所以在这种情况下, 我们甚至无法访问盒子的长度｡
‫比如说我想写长度｡
‫所以我想控制台右边的线框长度是, 然后就去取点框长度｡
‫如您所见, 我的ID甚至没有显示变量｡
‫我无法访问框点长度, 因此无法更改它｡
‫但我也可以不读它｡
‫好吧, 我会的
‫所以我既不能得到它, 也不能设置它｡
‫这是设置, 这是获取变量｡
‫这是非常重要的术语设置和获取, 因为现在我们可以在box类中创建方法,
‫它允许我们设置或获取变量长度｡
‫所以我们就这么做吧｡
‫让我们建立｡
‫萨特如此公开｡
‫Voit设置长度｡
‫因此, 此变量将设置长度｡
‫现在, 它将设置为什么？
‫这里需要一个变量或参数｡
‫这里需要一个可以设置的值｡
‫所以它只是要｡
‫这里需要一个整数, 我把它叫做length｡
‫因此它将设置长度｡
‫现在我要设定长度, 相等的长度｡
‫这是令人困惑的, 也是不正确的｡
‫所以我在这里得到了警告｡
‫这里甚至不会出现错误, 因为正如您所看到的, 颜色是不同的, 对吗？
‫所以这个颜色和那个颜色稍微有点不同｡
‫这个是很浅的颜色, 这个是深蓝色的.
‫这是怎么回事？
‫因为我们用的是同一个词｡
‫我们用的是长度｡
‫我们在这里和这里使用长度, 这里也是｡
‫所以这个长度实际上是或者应该是顶部的这个长度｡
‫所以如果我想正确地做, 我可以用这个关键字｡
‫通过这样做, 我说, 好吧, 我想改变长度, 也就是｡
‫零件｡
‫这门课叫Box｡
‫所以我想改变这个物体的长度｡
‫所以在这个例子中, 对象是在类框中创建的｡
‫好吧, 不管我被分配的长度是多少｡
‫所以调用set length时传递的长度是多少｡
‫这个方法将会是｡
‫这里的变量, 它会被设置为length, 也就是我盒子的私有成员变量.
‫这一点非常重要, 因为我现在能做的就是, 改变盒子的长度.
‫设定长度｡
‫我还可以将长度设置为, 例如, 3, 现在再次运行代码, 它将完美地工作｡
‫让我们看看｡
‫好吧, 我会的
‫我们到了｡
‫长度自由｡
‫身高是四等｡
‫好吧, 我会的
‫现在我们假设我不想有三个, 因为这是默认值｡
‫现在, 假设我想将长度设为4, 现在我们可以看到它正在工作, 音量也已调整｡
‫所以它甚至对计算起作用了｡
‫所以这很好｡
‫所以现在我们可以设置一个变量, 它是一个类的成员变量｡
‫所以这很重要｡
‫我们说的是不同的阶级｡
‫它不在同一个类中｡
‫现在我们可以尝试访问这个长度, 因为它是私有的, 对吗？
‫那我怎么才能访问它呢？
‫因为也许我真的需要这个变量｡
‫我想访问长度, 但我做不到｡
‫所以我可以实现一个getter｡
‫所以一拿到长短公｡
‫在这种情况下, 类型必须和我想返回的变量的类型相同｡
‫在这个例子中, 我想返回这个长度的值, 或者我想返回长度本身, 对吗？
‫所以它的类型是int｡
‫所以我需要为这个方法返回一个int类型｡
‫这是get length, 这也是使用名字的约定, get加上大写字母G,
‫然后是你想得到的变量的名字.
‫在这个例子中, 我想得到变量长度, 现在你只需要返回长度｡
‫现在, 为了更精确, 要返回这个点长度, 当然你可以只写长度,
‫但是当你加上这个, 那么很明显我们在这里讨论的是成员变量｡
‫所以我们讨论的变量是这个类的最高层｡
‫所以它不在任何方法中, 所以你甚至不能用这种方法访问它｡
‫但这里我们讨论的是这个特定的长度｡
‫所以如果我点击它, 你可以看到我的ID自动标记它｡
‫它也在底部标出了这个长度｡
‫所以现在我可以通过这个公共方法, 用get length来得到长度｡
‫它是公开的很重要, 因为如果它不是公开的, 那么我就无法访问它｡
‫所以在这个例子中, 我再次保存了盒子, 现在我通过调用这个方法get length来获取长度,
‫现在它突然又工作了｡
‫现在我可以继续了, 当然这里写的也是正确的, 长度也是正确的, 我们再运行一次｡
‫它会说盒子的长度是｡
‫在这个例子中, 它是4｡
‫好吧, 我会的
‫所以这只是为属性做准备, 但这是一个重要的概念｡
‫setter和getter, 这是你也会经常看到的东西｡
‫所以这是一个非常好的方法, 但是有很多更容易更快的方法｡
‫所以这只是一种方法｡
‫但我将向您展示两种甚至三种其他方法, 以使其更快, 并具有相同类型的保护｡
‫因为我们在这里做的叫做封装｡
‫所以我们封装了我们长度的轴｡
‫维基百科的定义是,
‫封装是指用对数据进行操作的方法来构建数据, 或者限制对某个对象的某些组件的直接访问｡
‫所以这正是我们正在做的｡
‫我们正在限制对这个称为length的组件的访问, 它是对象的一部分, 或者是我们可以创建对象的类盒的一部分｡
‫好吧, 我会的
‫我们创建这些setter和getter是为了调整它们｡
‫现在, 美妙之处在于您可以定义您想要如何封装｡
‫在这种情况下, 我把它们都公开了｡
‫但如果我不想公开呢？
‫如果我想这样呢？
‫不合适｡
‫假设我不希望任何人能够设置我的盒子的长度｡
‫所以我能做的就是把这个设为私人的｡
‫所以现在只能｡
‫继承自盒子的类或盒子本身将能够从外部设置长度｡
‫我们将无法再设定长度｡
‫所以在这里设置长度, 这行代码不再起作用了,
‫因为我决定, 如果有人想设置长度, 我只想成为类本身或者继承类, 而不是我之外的类.
‫您可以在此处直接修改此内容｡
‫你也可以说, 好吧, 即使得到长度也不允许在这里之外｡
‫好吧, 我会的
‫但现在很酷的是你可以继续调整这些｡
‫假设有人想要得到体积｡
‫现在, 我们还没有设置音量｡
‫所以我们可以做的是, 我们可以继续说public int, 得到volume｡
‫现在如果有人想得到体积, 我们不仅要返回体积, 我们要做的是返回｡
‫此点长乘以此点高乘以此点宽｡
‫因此, 如果有人想得到体积, 他们不会直接得到体积｡
‫所以不能直接得到这个变量, 这个体积变量, 但是他们会得到计算的结果｡
‫现在如果我保存这个, 然后继续, 这里我使用get volume, 然后boxes volume是,
‫现在它会显示盒子的体积｡
‫比如说盒子, 体积是60｡
‫所以现在我们对这些setter和getter所做的一般是, 我们不直给予成员变量提供对变量的访问权限, 而我们只提供对一个方法的访问权限,
‫然后这个方法可以调整变量, 我们可以自己决定如何传递这个值, 所以我们如何在这个例子中用get
‫volume传递这个值, 我们决定, 好吧, 我们不想给你音量本身,
‫但我们想给予你一个计算的结果｡
‫或者我们可以说, 好的, 如果有人想得到体积, 我们会说体积乘以2或者类似的东西｡
‫或者如果有人想设置长度, 而它是负的｡
‫假设我们再次将其设置为public, public void, set length, 现在我们再次检查if length.
‫小于零｡
‫我们将抛出一个错误, 抛出新的异常大小, 或者这个, 长度应该大于零｡
‫好吧, 我会的
‫所以如果length小于零, 我们就抛出一个异常, 这会导致程序崩溃.
‫所以这一行永远不会被执行｡
‫现在我们来试试这个｡
‫让我们转到我们的程序, 并将长方体长度设置为负值｡
‫我们把它设为负4｡
‫现在, 我们再次运行它, 我们将看到一个异常｡
‫所以我们的程序崩溃了, 我们得到一个异常.
‫系统异常长度应大于零｡
‫所以你看, 通过抛出异常, 我们可以抛出我们自己的异常｡
‫我们甚至可以说例外应该说什么, 它应该是有意义的｡
‫它应该是有用的东西, 并明确指出错误是什么｡
‫在本例中, 我们创建了一个错误, 因为我们将长度设置为小于零的值｡
‫好吧, 我会的
‫这就是setter和getter的功能, 因为你可能会想, 为什么我需要这些setter来得到我们呢？
‫如果我只有setter和getter, 为什么不能直接访问长度呢？
‫好了, 现在你看到了, 你可以积极地决定什么将被设置, 什么将被遗忘｡
‫如果有人试图访问这个变量并更改它, 甚至只是检索它｡
‫好吧, 我会的
‫所以这比我预期的要长得多, 我打算做这个视频｡
‫但我真的想把一切都说清楚, 因为这将是下一个概念的重要垫脚石,
‫下一个概念将是属性｡
‫所以你将看到我们如何总结这一切, 或者通过使用属性使它更短｡
‫因此, 我们来看下一个视频, 了解如何使用属性,
‫以及它们与本视频中所学内容的关系｡
‫我希望这是有意义的｡
‫如果您有任何问题, 请告诉我｡
‫是的, 只要在课程讨论中写一条评论｡
‫顺便说一句, 非常感谢每一个提供反馈的人, 因为这真的帮助我把课程做得更好｡
‫如果你只是被动地看这门课, 那完全没问题｡
‫但我真的很感谢你的反馈, 这是建设性的, 真的帮助我知道在哪一点上的东西是不清楚的｡
‫因为如果你只是说, 好吧,
‫这个视频完全是垃圾, 那么它就不会像你说, 好吧, 我在第五分钟什么的时候没有理解概念A那样有用, 那么我就更好地理解问题出在哪里了｡
‫再次感谢大家, 下一个视频再见｡