Java面向对象编程之 类和对象 | Java OOP Class and Object

Made by Mike_Zhang


Java主题:


OOP Introduction

请阅读本博客的Java面向对象编程详细介绍 - Java OOP Detailed Introduction


类的属性和方法

1. 类的属性 (Field)

类的属性又称为成员变量, 英文为Field. 以下代码构造了一个Book类, Book为类的名称, 设置了两个属性, 字符串类的name, 用于存储书名, 以及整数类型的page, 用于存储页数. 属性可以设置初始值, 如不设置初始值, 则会有默认值.

1
2
3
4
public class Book{ // 构造名为Book的类
String name; // 构造Book类的一个属性name, 理解为书名
int page; // 构造Book类的另一个属性page, 理解为页数
}

2. 类的方法 (Method)

类的方法又称为成员方法, 英文为Method.

1
2
3
4
5
6
7
8
9
10
11
public class Book{ // 构造名为Book的类
String name; // 构造Book类的一个属性name, 理解为书名
int page; // 构造Book类的另一个属性page, 理解为页数

public void setName(String inName){ // 构造一个名为setName的方法, 用于设置Book类的name属性.
name = inName;
}
public String getName(){ // 构造一个名为getName的方法, 用于获取Book类的name属性
return name;
}
}

以上代码给Book类添加了两个方法.
第一个方法setName为设置Book类的name属性, 即给书本一个名字. public为权限修饰符, public表示此方法可以被本类, 子类以及其他包中的类使用, 理解为公开的. void表示此方法无返回值, 理解为表示返回值为空. setName为方法的名称. 括号中的inName是方法的参数(parameter), String表明了参数的数据类型. name = inName; 表示把对象的name属性设置为setName中的参数inName, 例如:

1
2
3
Book mybook = new Book(); // 构造Book类的对象
String mybookname = "ABC"; // 书名存入变量
mybook.setName(mybookname); // 调用Book的setName方法, 设置书名为ABC

第二个方法getName为获取并输出书的名字, String表示此方法有返回值, 并且返回值为字符串类型. return name; 表示返回对象的name属性, 例如:

1
2
3
4
Book mybook  = new Book(); // 构造Book类的对象
String mybookname = "ABC"; // 书名存入变量
mybook.setName(mybookname); // 调用Book的setName方法, 设置书名为ABC
System.out.println(mybook.getName()); // 调用Book的getName方法, 获取书的名字并打印输出, 输出的即为方法的返回值“ABC”

当一个类中有多个相同名字的方法,则被称为方法重载。根据 方法名参数类型(数量、类型以及排列顺序) 来判断是否能重载。参数的类型、返回值类型并不会被考虑。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Book{ // 构造名为Book的类
String name; // 构造Book类的一个属性name, 理解为书名
int page; // 构造Book类的另一个属性page, 理解为页数

public void setName(){ // 构造一个名为setName的方法
/*...*/
}

public void setName(int inNameNum){ // 构造一个名为setName的方法, int参数
/*...*/
}

public void setName(String inName){ // 构造一个名为setName的方法, String参数
/*...*/
}
/* 以下两个方法都是不合法的重载

public int setName(String inName){ // 返回值不同并不考虑
//...
}

public void setName(String theName){ // 参数名不同并不考虑
//...
}
*/
public void setName(String inName, int inNameNum){ // 构造一个名为setName的方法, String参数和int参数
/*...*/
}

public void setName(int inNameNum, String inName){ // 构造一个名为setName的方法, 和nt参数和String参数
/*...*/
}
}

当以上某一方法被使用时,编译器会根据 方法名参数类型(数量、类型以及排列顺序) 来调用相对应的方法。


3. 类的构造方法 (Constructor)

类的构造方法(Constructor)是一种的特殊的方法, 每次用类实例化一个对象时, 构造方法会自动调用.
构造方法有三个特性:
>构造方法的名称与类的名称相同;
>构造方法没有返回值, 但是不需要用void修饰字符;
>可含参数,但不能是this. (点此了解this)

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Book{ // 构造名为Book的类
String name; // 构造Book类的一个属性name, 理解为书名
int page; // 构造Book类的另一个属性page, 理解为页数

Book(){ // 无参构造方法
System.out.println("成功创建一个Book类对象");
}

public Book(String initName){ // 有参构造方法
name = initName; // 有参数的构造方法, 创建对象时就设置对象name属性, 即为书名
System.out.println("成功创建一个Book类对象"); // 每当Book类创建一个实例对象, 会输出一语句
}

public void setName(String inName){ // 构造一个名为setName的方法, 用于设置Book类的name属性.
name = inName;
}
public String getName(){ // 构造一个名为getName的方法, 用于获取Book类的name属性
return name;
}
}


注:若一个类没有构造方法,在编译时编译器会自动加入一个无参的空构造方法,也会在对象创建时被调用。但是如果只定义了有参构造方法,在创建对象时调用无参构造方法是不合法的,例如:

1
2
3
4
5
6
public class Book{ // 构造名为Book的类
public Book(String initName){ // 有参构造方法
name = initName; // 有参数的构造方法, 创建对象时就设置对象name属性, 即为书名
System.out.println("成功创建一个Book类对象"); // 每当Book类创建一个实例对象, 会输出一语句
}
}

运行:

1
2
Book mybook = new Book(); // 错误
Book mybook = new Book("myBookName"); // 运行

若一个类包括了多个构造函数,这就被称为构造函数重载 (Constructor Overloading),其在构造函数的三个特性上还有需要有不同的参数类型,例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Book(){ // 无参构造方法
this("NoBookName");
}
Book(String initName){ // 有参构造方法,参数类型为 String
this(1);
name = initName;
}
Book(int initBookAmount){ // 有参构造方法,参数类型为int
bookAmount = initBookAmount;
System.out.println("成功创建一个Book类对象,请修改书名!");
}

public static void main(String[] args) {
Book myBookA = new Book(); //调用无参构造方法 Book()
Book myBookB = new Book("MyBookB"); //调用有参构造方法 Book(String initNam)
Book myBookC = new Book(100); //调用有参构造方法 Book(int initBookAmount)
// ...
}

在创建对象时,会根据不同的参数类型调用相对应参数类型的构造函数,实现一一对应。


权限修饰符 (Visibility Modifiers)

Java中的权限修饰符主要包括private, protectedpublic. 这三个权限修饰符决定了类, 类的属性和类的方法的访问范围.

private
设置为private的属性和方法只能在本类中使用, 同包其他类或子类 以及 其他包的类或子类不可使用

protected
设置为protected的属性和方法只能在本类 以及 同包其他类或子类中使用, 其他包的类或子类不可使用

public
设置为public的属性和方法能在本类, 同包其他类或子类 以及 其他包的类或子类中都可以使用

具体见Java基础学习1—声明和初始化与修饰符


对象 (object)

对象(object)是某一类的实例, 有具体的属性和方法.

对象的创建

Java中通过 new 操作符号来创建对象, 语法为: 类名 对象名 = new 类名( );
每次创建一个实例, 都会调用一次类的构造方法.

1
2
Book mybook = new Book(); // 无参数, 无构造方法参数
Book mybook = new Book("My Book Name"); // 有参数, My Book Name为构造方法的参数, 设置书名

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Book{ // 构造名为Book的类
String name; // 构造Book类的一个属性name, 理解为书名
int page; // 构造Book类的另一个属性page, 理解为页数

public Book(String initName){ // 构造方法
name = initName; // 有参数的构造方法, 创建对象时就设置对象name属性, 即为书名
System.out.println("成功创建一个Book类对象"); // 每当Book类创建一个实例对象, 会输出一语句
}
public void setName(String inName){ // 构造一个名为setName的方法, 用于设置Book类的name属性.
name = inName;
}
public String getName(){ // 构造一个名为getName的方法, 用于获取Book类的name属性
return name;
}
public static void main(String[] args) { // 主方法
Book mybook = new Book("My Book Name"); // 构造一个名为mybook的Book类对象, 并使用构造方法设置name属性

}
}

对象属性和行为的访问

对象属性和行为的访问结构为“对象.属性”或“对象.方法”, 例如:

1
2
3
mybook.name; // 获取mybook的name属性
mybook.getName(); // 获取mybook的name属性, 并返回name的值
mybook.setName("My Another Book"); // 调用mybook的成员方法, 设置name属性为“My Another Book”

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Book{ // 构造名为Book的类
String name; // 构造Book类的一个属性name, 理解为书名
int page; // 构造Book类的另一个属性page, 理解为页数

public Book(String initName){ // 构造方法
name = initName; // 有参数的构造方法, 创建对象时就设置对象name属性, 即为书名
System.out.println("成功创建一个Book类对象"); // 每当Book类创建一个实例对象, 会输出一语句
}
public void setName(String inName){ // 构造一个名为setName的方法, 用于设置Book类的name属性.
name = inName;
}
public String getName(){ // 构造一个名为getName的方法, 用于获取Book类的name属性
return name;
}
public static void main(String[] args) { // 主方法
Book mybook = new Book("My Book Name"); // 构造一个名为mybook的Book类对象, 并使用构造方法设置name属性
System.out.println(mybook.name); // 通过对象的属性获取属性值
System.out.println(mybook.getName()); // 通过对象的方法获取属性值

mybook.setName("My Another Book"); // 通过对象属性重置属性值
mybook.page = 100; // 通过对象属性重置属性值
}
}

参考

B. Eckel, Thinking in java. Upper Saddle River, N.Y. Prentice Hall, 2014.
M. Goodrich, R. Tamassia, and A. O’reilly, Data Structures and Algorithms in Java, 6th Edition. John Wiley & Sons, 2014.


写在最后

Java中OOP相关的知识是十分重要的, 会继续更新.
最后,希望大家一起交流,分享,指出问题,谢谢!


原创文章,转载请标明出处
Made by Mike_Zhang




感谢你的支持

Java面向对象编程之 类和对象 | Java OOP Class and Object
https://ultrafish.io/post/Java-oop-class-object/
Author
Mike_Zhang
Posted on
March 7, 2021
Licensed under