目录
类的设计
作为Java程序的基本要素,类由成员变量(也称属性)和成员方法组成。属性包括常量和变量,方法则包括构造方法和自定义方法,在定义类时,它们习惯上按如下次序排列:
public class Order{
// final属性
// 属性
// 构造方法
// 自定义方法
}
类的属性一般定义为私有的,而类的方法定义为public。
-
访问修饰符
Java中定义了private、public、protected和默认的访问修饰符,这些修饰符控制着对类和类的成员变量以及成员方法的访问规则。另外,还可以辅助static和final关键字定义特殊规则。
访问包位置 | 类修饰符 | |||
修饰符 | Private | protected | 默认修饰符 | Public |
本类 | 可见 | 可见 | 可见 | 可见 |
同包其他类 | 可见 | 可见 | 可见 | |
其他包的类 | 可见 | |||
同包的子类 | 可见 | 可见 | 可见 | |
其他包的子类 | 可见 | 可见 |
public是公有类型的权限修饰符,使用public修饰的类、成员变量和成员方法,其他类都可以访问,包括任意包中的任意类以及子类。
private是私有类型的权限修饰符,使用private修饰的成员变量和成员方法,只能在本类中被使用,在子类中是不可见的,并且对其他包的类也是不可见的。
protected是保护级别的权限修饰符,它保护成员不会被其他包或非子类访问。也就是说protected修饰的成员只能被同一包中或不同包但是子类的访问。
default当不添加任何权限修饰符时,编译器会使用默认权限修饰符,只能在同一包中。
- 封装(encapsulation)
封装是指把对象的属性隐藏在对象的内部,不允许外部直接访问和修改。Java规范中的设置器和 访问器就是实现封装的标准方法,它们用于设置和获取对象的属性值。
设置器方法的命名一般以set作为方法名的前缀,以属性名作为后缀。
访问器方法的命名一般以get或is作为方法名称的前缀,以属性名作为后缀。对于boolean类型的属性,应该使用is前缀定义访问器 方法。例如:
public class Car {
private String color;
private boolean running;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public boolean isRunning() {
return running;
}
public void setRunning(boolean running) {
this.running = running;
}
}
- Object类
在Java中,所有的类都直接或间接继承了java.lang.Object类,它是所有类的父类。Object类中常用的两个方法为equals()和toString()方法。任何类都可以重写Object类中的方法。
Object类处于Java继承层次中的最顶端,它封装了所有类的公共行为。
Object类的equals()方法采用的是==运算比较,也就是只有两个引用变量指向同一对象时才相等。而实际上我们期望该方法进行对象的内容比较,因此子类中通常将equals()方法改写。
类的toString()方法返回对象的描述信息,在Object类中该方法返回对象的类名及对象引用地址。子类中通常要提供自己的toString()方法,以便更好地描述对象。
- 对象的创建与构造方法
类是创建对象的模板,而对象是类的实例。对象是一组属性和方法的封装体,创建对象要用到保留字new,对象的构造方法的语法格式为:
引用变量 = new构造方法(参数)
有关构造方法有以下几点说明:
- 创建对象时将用到构造方法,系统自动调用参数匹配的构造方法为对象初始化。
- 构造方法的名称必须与类名同名,构造方法没有返回类型。
- —个类可提供多个构造方法,这些构造方法的参数不同。
- 如果程序中未提供构造方法,系统自动提供空的无参构造方法。
- 对象引用变量与对象关系
对象创建后,将对象的引用赋值给某个引用变量,就可以通过该变量访问对象的成员属性和方法,成员的调用通过“.”运算符实现,格式为:
对象名.属性
对象名.方法(参数)
-
静态空间与实例空间
带有static修饰的属性称为静态属性或类变量;带有Static修饰的方法称为静态方法, 在静态方法内可以直接讨问静态属性或调用其他静态方法,静态属性在分配空间时与对象无关,静态空间的引用是与类关联的,一个类的静态属性成员只有一份,访问静态成员可以通过类名(在自己类中也可以直接访问),也可以通过对象。静态属性是共享的,该类的任何对象均可访问它。
【思考】静态属性归属类,因此必须指明是访问哪个类的静态成员,如果是在自己类中则可以省略,由于对象由类创建,自然对象能标识其所属类,因此也允许用对象做前缀访问静态属性。非静态属性也称实例变量,也就是说,要通过实际的对象才能访问,不同对象其实例变量的值通常是不同的。
-
Math类
Java 的 Math类包含了用于执行基本数学运算的属性和方法,如平方、对数、平方根和三角函数等。下表为 Math 类的一些常用方法。
方法 | 描述 |
abs(x) | 返回参数x的绝对值,不改变x的数据类型 |
sqrt(x) | 计算x的平方根,返回值为 double |
cbrt(x) | 计算x的立方根,返回值为 double |
floor(x) | 返回小于x的最大整数(向下取整),返回类型为 double |
ceil(x) | 返回大于等于x的的最小整数(向上取整),返回类型为 double |
round(x) | 将x四舍五入取整,返回值为 long |
pow(x,y) | 计算x的y次方,返回类型为 double |
max(x,y) | 计算x和y的最大值,返回类型为 double |
min(x,y) | 计算x和y的最小值,返回类型为 double |
sin(x) | 求x的正弦值 |
cos(x) | 求x的余弦值 |
tan(x) | 求x的正切值 |
asin(x) | 求x的反正弦值 |
acos(x) | 求x的反余弦值 |
atan(x) | 求x的发正切值 |
toDegrees(x) | 将x转化为角度 |
toRadians(x) | 将x转换为弧度 |
PI | π |
- 例如:
Math.pow(x, y) Java 的幂运算,意思为求x的y次方,x和y可以是整型也可以是浮点型,该方法返回一个浮点型的值
例子:
double a = Math.pow(2, 3); // 求2的3次方,并将其赋值给一个double型的变量a
System.out.print(a);
执行结果:8.0
- 例如:
Math.sqrt(x) Java 开平方的方法,意思为求x的平方根,x可以是整型也可以是浮点型,该方法返回一个浮点型的值。
例子:
double a = Math.sqrt(4);// 求4的平方根,并将其赋值给一个double型的变量a
System.out.print(a);
执行结果:2.0
-
Random类
在 Java 中有一个 Random 类,他可以在指定的取值范围内随机产生数字。要想使用 Random 类,第一步需要导入 java.util.Random 这个包。例如:
import java.util.Random;
第二步需要创建 Random 对象。
Random random = new Random();
创建完 Random 对象之后,我们就可以使用它提供的方法来创建随机数了。
方法名 | 方法说明 |
nextDouble() 方法 | 返回 0.0 至 1.0 之间的 double 类型值 |
nextFloat() 方法 | 返回的是 0.0 至 1.0 之间的 float 类型值 |
nextInt(int n)方法 | 返回的是 0(包括)至 n(不包括)之间的 int 值 |
代码示例:
public class RandomTest {
public static void main(String[] args) {
Random random = new Random();
System.out.println(random.nextInt(10));
System.out.println(random.nextFloat());
System.out.println(random.nextDouble());
}
}
第一次运行结果:
4
0.60541
0.7046691676099207
第二次运行结果:
3
0.055246472
0.47445795351116005
我们可以看到第一次运行结果和第二次运行的结果是不一样的。当我们想要第一次和第二次运行结果一致的话,可以在创建 Random 对象的时候传入一个 Long 类型的数字,这个数字叫随机种子。具有相同随机种子的 Random 对象生成的随机数是一样的。
示例:
public static void main(String[] args) {
// 创建一个Random对象并传入随机种子
Random random = new Random(10);
System.out.println(random.nextInt(10));
System.out.println(random.nextFloat());
System.out.println(random.nextDouble());
}
第一次运行结果:
3
0.44563425
0.2578027905957804
第二次运行结果:
3
0.44563425
0.2578027905957804