1. 构造器
1.1 用构造器确保初始化
- 可以假想为编写的每一个类都定义一个 initialize() 方法
- 该方法的名称提醒你在使用其对象之前,应首先调用 initialize()。然而,这同时意味着用户必须记得自己去调用此方法
- 在 Java 中,通过给定【构造器】,类的设计者可确保每个对象都会得到初始化
- 创建对象时,如果其类具有构造器,Java 就会在用户有能力操作对象之前自动调用相应的构造器,从而确保了初始化的进行。
- 如何命名这个方法?
- Q1:所取得任何名字都可能与类的某个成员名称相冲突;Q2:调用构造器是编译器的责任,所以必须让编译器知道应该调用哪个方法
- 解决方法:构造器采用与类相同的名称
- 如何使用构造器?
- 老早就已经开始使用了,如:
Person p = new Person();
该语句会为对象分配存储空间[new],并调用相应的构造器[Person()]。这就确保了你在能操作对象之前,它已经被恰当地初始化了。 - 从概念上讲,"初始化" 和 "创建" 是彼此独立的,但在 Java 中,"初始化"和"创建"捆绑在一起,两者不能分离。
- 构造器是一种特殊类型的方法,因为它没有返回值,这与返回值为 void 明显不同;构造器不会返回任何东西 (new 表达式确实返回了对新建对象的引用,但构造器本身并没有任何返回值)
- 老早就已经开始使用了,如:
1.2 特征
- 它具有与类相同的名称
- 它不声明返回值类型(与声明为void不同)
- 可以有参数,也可以没有参数
- 不能有
return _____;
1.3 分类
- 不接受任何参数的构造器叫做【默认构造器(无参构造器)】
- 如果没有给出构造方法,则编译器会自动帮你创建一个默认构造器
public Person() {}
- 但和其他方法一样,构造器也能带有形式参数,以便指定如何创建对象
- 如果已经定义了一个或多个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器
public Person(String name, int age) {...}
public Person(String name) {...}
public Person(int age) {...}
public Person() {...}
1.4 注意
- Java 语言中,每个类都至少有一个构造器
- 默认构造器的修饰符 与 所属类的修饰符 一致
- 一个类可以创建多个重载的构造器
- 定义一个有返回值且方法名与类名同名的方法是 OK 的,程序不会报错。
2. 属性的赋值过程
赋值的位置:
- 默认初始化
- 显式初始化
- 构造器初始化
- 通过 "对象.属性" 或 "对象.方法" 的方式赋值
赋值的先后顺序:① → ② → ③ → ④
3. JavaBean
JavaBean 是一种 Java 语言写成的可重用组件,所谓 JavaBean,是指符合如下标准的 Java 类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的 get、set 方法
统一建模语言(Unified Modeling Language, UML)
4. this
4.1 引入
为了能用简便、面向对象的语法来编写代码,编译器做了一些幕后工作。它暗自把 “所操作对象的引用” 作为第一个参数传递给 show()。所以上述两个方法调用变成了:a1.show(a1); a2.show(a2);
。
每个 !static 方法的形参列表中都隐含一个指向当前正在调用该方法的对象形参。
4.2 概述
假设你希望在方法的内部获得对当前对象的引用。由于这个引用是编译器“偷偷”传入的,所以没有标识符可用。但是,为此有个专门的关键词:this,它是一个系统隐含的指针,被自动附加在非静态的成员方法参数列表中。
this 只能在方法内部使用,表示对“调用方法的那个对象”的引用;this 的用法和其他对象引用并无不同。注意,如果在方法内部调用同一个类的另一个方法,就不必使用 this,直接调用即可。当前方法中的 this 引用会自动应用于同一类中的其他方法。
特殊情况,如果方法的形参和类的属性同名时,必须显式的使用“this.属性”的方式,表明此变量是属性,而非形参。
this 可以调用类的属性、方法和构造器。根据使用环境不同,具体可分为 2 种情况:
- 在成员方法中:代表调用了该方法的对象
- 在构造器中:代表该构造器正在初始化的对象
4.3 在构造器中调用构造器
可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可用 this 做到这一点。
通常写 this 的时候,都是指“当前对象”,而且它本身表示对当前对象的引用。在构造器中,如果为 this 添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用(除构造器外,编译器禁止在其他任何方法中调用构造器)
注意,尽管可以用 this 调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始处,否则编译器会报错。
5. package
- 为了更好的实现项目中类的管理,提供了“包”的概念
- package 语句作为 Java 源文件的第一条语句,指明该文件中定义的类所在的包
- 包对应于文件系统的目录,package 语句中,用“.”来指明包(目录)的层次
- 格式:
package 顶层包名.子包名;
MVC 设计模式
JDK 中主要包介绍:
6. import
- 为使用定义在不同包中的 Java 类,需用 import 语句来引入指定包层次下所需要的类或全部类(.*) // import 语句告诉编译器到哪里去寻找类
- 语法格式:
import 包名.类名;
- 应用举例
import java.util.*;
import cn.edu.nuist.test.Demo;
- 如果导入的类或接口是 java.lang 包下的,或者是当前包下的,则可以省略此 import 语句
- 如果在代码中使用不同包下的同名的类,那么至少有一个类需要使用类的全类名的方式指明调用的是哪个类
import java.util.*; ... Date date = new Date();
java.sql.Date date1 = new java.sql.Date(1064603372);
- 已经默认导入 java.lang 包下的类,那么如果还需要使用 lang 包下的子包中的类的话,仍然需要导入
- import static 组合的使用:调用指定类或接口下的静态的属性或方法(注意!落脚点是类中的结构)
import static java.lang.System.*; ... [System.(省略)] out.println("Hello");
import static java.lang.Math.*; ... [Math.(省略)] round(10.24);