()Encapsulation
The instance data of an object should be modified only by that object.(An object should be encapsulated from the rest of
the system.)
需用如下方法才能 调用或修改 private data:
The names of accessor and mutator methods can usually take the form getX and setX, respectively, where X is the name of the value. E.g. getName, setName methods could be used to access and change the variable called name inside an
object。
Visibility modifiers
![](https://i-blog.csdnimg.cn/blog_migrate/6eca91ca3381d89f5a6fe8d4343434a2.png)
The effects of public and private visibility
使用private关键字:
注意:若使用该方法,则不需要再用construct进行初始化!
每个成员变量对应一对getter 和 setter(注意布尔类型变量的getter为is)才能访问和修改成员变量。
在其它class里面通过以上方法访问这个Demo类:
自动生成:
Eclips环境:
代码的空白处点右键,或者在Person类名上点右键 —> Source –> Generate Getters and Setters(或直接从菜单进入)
如果是constructor:
空白处点右键,或者在类名上点右键 —> Source –> Generate Constructor using Fields
IDE环境:
也可用于写constructor
toString() method
When we wanna print out a object("p1"):
Java will converts the Person object p1 to a String using a special method toString(), which means:
Java will print:
(返回类名+@+哈希值的16进制形式)
以上是没有经过重写(override)直接输出对象student_object3的情况。
实践中为了方便,我们可以根据需要在被调用的类中重写toString()方法,注意要根据以下语法结构:
Careful: toString does not print to the console! It “converts” an object to a String representation
在一个类中重写toString()方法:
如图,定义了一个Box的class (constructor下面的getter和setter已省略)
快捷方式:(Eclipse)
在该类(Box)里面按Alt+Shift+S,或点击source =>点击Generate toString()
如上图,我们可以根据需要勾选需要表达的相关值,然后点generate,eclipse会自动生成以下 toString()方法
当我们在主类里调用这个toString()时,(box1是在main class里对Box类进行了实例化)
输出如下:
(相关值是在主类里被赋值的,此处省略)
可以看到屏幕输出是与 override时的return内容一致。这就是重写和不重写(直接输出对象)的区别。
使用该方法就可以不需要使用.(dot)来访问和输出对象或类的相关数值。
上面的例子只是用toString()输出对象属性的值,我们还可以输出对象的方法的值:
定义一个类Sphere用于球体相关数值计算:
如图我们可以通过改变return后的内容来变更我们最终输出效果。
此外,我们为了输出球体面积和体积,在generate toString()方法时,额外勾选了 volume和surface这两个方法:
这意味着,toString()方法会同时return volume&surface这两个方法的return值。
在主类中调用:
输出如下:
static keyword
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
static修饰的变量和方法,在程序编译的时候就存在了,而普通的变量和方法,只有在编译完程序执行的时候才被初始化。一句话,static与程序同生同死。因此static的方法不能调用非static变量和成员
The static modifier is also used to define constants
static变量:
static 方法:
final keyword
final关键字可以用于三个地方。用于修饰类、类属性和类方法。
被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被覆盖(重写);
对于被final关键字修饰的类属性而言,子类就不能给他重新赋值了,如果重新赋值,会报错.
若要修改相关method,就只能在其所在类里面进行修改,不能通过override来修改。
当final被用于修饰class时,该class不能被继承
例如在Java中 String 这个类 就是被final 修饰的,所以我们就不能通过子类继承它
Enumeration
用枚举固定元素和值的关系,使元素成为常量;
枚举也是一个类,是单独的enum 类型,
enum里面的元素就是enum的对象,这些元素是enum实例化之后的东西 所以说我们不能再在外面实例化enum了。
需要这样添加:
注意:enum类型不能实例化成对象
比如定义一个color类型,
然后试着在主类里实例化它(用new关键词)就报错
但我们还是可以声明一个color类型的变量(此时这个变量只能从枚举里的元素选择一个赋值),并打印它:
output:(println命令打印时,enum调用了自带的toString()方法)
比较:
vlaueOf()
vlaueOf("Red")方法返回的是color.Red 所以这个写法与上面直接用color1的写法一样
values()
返回enum的array
输出enum里的所有元素
给enum里的元素增加更多details:
这里的constructor和seter,getter 相当于所有元素都有各自的一组constructor和seter,getter
for each循环:
方便用来遍历数组、集合
语法
output
另一例子(与构造方法使用)
作业中的enum运用实例:
Rating enum如下:
Film class代码如下:
假设我们用一个Demo class调用Film class
因为Film class属性含有Rating enum,所以调用Film class即是调用了Rating enum
UML class diagrams
Example:
Has-a relationship
aggregation
The Person object belongs to the Car object
The Car object has-a Person object
composition
for enum:
Association:
(包括enum)用这个箭头