【Java】对象与类
LocalData类
java.time.LocalDate;
static LocalTime now();
构造一个表示当前日期的对象。
static LocalTime of(int year,int month,int day);
构造一个表示给定日期的对象。
int getYear();
int getMonthValue();
int getDayOfMonth();
得到当前日期的年、月和日。
DayofWeek getDayOfWeek
得到当前日期是星期几,作为DayOfWeek类的一个实例返回。
调用getValue来得到1~7之间的一个数,表示这是星期几,1表示星期一,7表示星期日。
LocalDate plusDays(int n)
LocalDate minusDays(int n)
生成当前日期之后或之前n天的日期。
构造函数
在构造函数上C++与Java最大的区别是,Java所有的构造必须使用new在堆上构造。
值得注意的是,不要再构造函数里声明与实例域同名的局部变量。
在C++中,一般把方法定义在类的外面,把方法定义在类的里面就成立内联函数。但是在Java中没这个说法,是否是内联函数,将有虚拟机自行决定。
更改器和访问器
更改器其实就是set方法。通过set方法对成员变量进行更改。
访问器就是get方法。通过get方法获取成员变量的值。
要注意的是,对于get方法不要返回可变对象。可变对象的意思就是不用更改器就能该改变的值,毕竟想要改变值需要用set方法。
final
添加有关键字final的成员变量,说明在构造对象的时候必须初始化。并且之后的操作不能再对其修改。
static
静态成员变量代表,所有的对象同时拥有着一个变量。
静态成员方法也只能访问静态成员变量。静态成员通过类名调用。(虽然对象也可以,但是不建议)
传参(重要)
在Java中,所有的传参都是按照值传递的方式。
传普通变量,是按值传递。
传类对象,也是按值传递。但是类对象使用new在堆上构造的,所以类对象其实保存的是一个地址,该地址对应堆上的对象。所以如果参数传的的是类对象,其实传的也就是那个地址的值的拷贝。
再强调一下:
- 对于基本数据类型来说 “=”赋值操作是直接改变内存地址(存储单元)上的值。
- 对于引用类型来说 “=” 赋值操作是改变引用变量所指向的内存地址。
对象构造
Java支持在类中写了成员变量后直接给一个初始值。甚至可以这样:
class Employee
{
private static int nextId;
private int id = assignl();
...
private static int assignl()
{
int r = nextId;
nextId++;
return r;
}
}
注:
- 在Java的构造方法中如果第一句是this(..);那么这句话可以调用该类的另一个构造方法。
- 在Java的构造方法中还存在初始化块的概念。例子:
class Employee
{
private static int nextId;
private int id;
...
//初始化块
{
id = 1;
}
//静态初始化块
static
{
nextId = 1;
}
}
这些初始化块会在调用构造函数时在构造函数函数体之前执行。
会先执行静态初始化块,再执行初始化块,最后执行构造函数。
并且如果静态初始化在主类中,那么会在main方法之前执行。
包
Java使用包(package)将类组织起来。包的作用就是防止名命冲突。
从编译的角度看,嵌套包之间没有任何关系。例如:java.util包和java.util.jar包
导包:使用import语句。该语句类似于C++中的namespace和using。
打包:package语句。
类的路径必须与包名匹配。
文档注释
JDK包含一个工具叫javadoc,它可以由源文件生成一个HTML文档。在源代码中添加/**开始的注释,可以将代码和注释保存在一个地方。
类注释
方法注释
- @param 变量描述
- 这个标记将对当前方法的“param”(参数)部分添加一个条目。一个方法的所有@param标记必须放在一起。
- @return 描述
- 这个标记将对当前方法添加“return”(返回)部分。
- @throws类描述
- 这个标记将添加一个注释,用于表示这个方法有可能抛出异常。
类的设计技巧
- 保证数据私有
- 保证数据初始化
- 不要再类中使用过多的基本类型
- 将职责过多的类分解
- 类名方法名要能体现出其职责
- 优先使用不可变类