对象和类
对象和类是 Java 和绝大多数编程语言的面向对象编程基础。简要来说,对于现实或虚拟中的实体,一个类(英文:Class)可以定义一个实体,类下面有若干属性,用来从各方面描述这个实体。
类下面的属性有 Public 和 Private 两种,其中 Public 可以被类内和类外的任意方法(英文:Method)调用,而 Private 属性则只能由类内和子类的方法调用。
对象初始化
类下可以创建对象(英文:Object):
Person p = new Person();Java此过程又被称为对象初始化,对象具有具体的属性值。
Human furina = new Human();
furina.name = "Furina";
furina.sex = "女";
furina.age = 500;Java构造方法
使用构造方法(英文:Constructor)时注意,构造方法是无返回的方法。
class Person {
public Human(){
name = "traveler";
sex = "女";
age = 10000;
System.out.println("已执行:构造方法");
}
}Java对于该种构造方法的补充:即当将来其他地方进行新的对象初始化时,把新对象的成员变量(英文:member variable)设为这些初始值:
Human kamisato_ayaka = new Human();Java此时即使没有进行对象属性的初始化,则默认会将构造方法中填充的初始值赋值到这个新对象上。
构造方法具有隐含变量 this,它指向「当前正在被构造的对象」。因此构造方法的完整写法为:
class Person {
public Human(){
this.name = "traveler";
this.sex = "女";
this.age = 10000;
System.out.println("已执行:构造方法");
}
}Java其中的 this 在常规写法中通常被省略。
无参构造方法
一般情况下,如果没有定义构造方法,则系统会提供无参构造方法:
class Person{
public Human(){
}
}Java构造方法重载
方法重载(英文:Method Reload)具有以下特点:
- 方法名相同
- 参数数据类型或参数个数不同
- 与返回值、访问修饰符无关
例如以下两个构造方法可被看作方法重载:
public Human() {
name = "traveler";
sex = "女";
age = 10000;
love = 80;
}Javapublic Human(String name, String sex, int age, int love) {
this.name = name; //名字
this.sex = sex; //性别
this.age = age; //年龄
this.love = love; //好感度
}Java构造方法重载调用
以上一部分提到的方法重载构造方法为例,则构造方法重载的调用如下实现:
traveler = new Human();
traveler.print();
furina = new Human("芙宁娜", "女", 500, 100);
furina.print();Java封装
封装用来解决类的属性可以被随意访问和随意赋值的问题。例如:
Human furina = new Human();
furina.love = -1000;Java此时 love 属性值可以明显发现不合法(invalid)。Java 的封装正是为了解决此种问题而诞生。
封装会将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过类提供的方法来实现对这些隐藏信息的操作和访问。
使用封装需要以下步骤来实现:
- 将属性的可见性设为
private(私有的) - 在属性所属的类中创建公有的
getter/setter方法,用于对隐藏属性的读写操作 - 在
getter/setter方法中加入属性控制语句,对属性值的合法性进行判断
例如在下面的代码中:
class Human {
private String name = "芙宁娜";
private String sex = "女";
private int love = 50;
pricate int age = 500;
public int getLove() {
return love;
}
public void setLove (int love) {
if (love > 100 || love < 0) {
this.love = 50;
System.out.println("好感度 应该属于 值 的 0 - 100 ");
} else {
this.love = love;
}
//... other getter / setter method
}Javapublic int getLove() 就是一个 getter 方法;对应的,public int setLove 就是一个 setter 方法。