目录
一、构造方法
1. 构造方法概述及格式
- 构造方法作用
- 创建对象,当new一个对象时,构造方法就执行了
- 对对象的内容进行初始化
- 格式
修饰限定符(一般是public) 类名(){ 方法体; }
- 构造方法特点
- 无返回值类型,连void也没有
- 方法名与类名相同,大小写也一致
- 无返回值
2. 构造方法使用及注意事项
-
使用方法
- 空参构造:只是创建一个对象
- 有参构造:创建一个对象的同时对对象内容进行初始化
-
举例
public class Student { String name; String ID; int age; char sex;//定义成员变量 public Student() {//这是空参构造,如果不写,系统会默认提供,只是初始化一个对象 } public Student(String name, String ID, int age, char sex) { this.name = name;//这个是有参构造,可以在初始化对象的时候赋初值 this.ID = ID; this.age = age; this.sex = sex; } } public class StudentTest {//测试类 public static void main(String[] args) { //用无参构造创建一个对象并进行初始化 Student student1 = new Student();//new一个学生类对象student student1.name = "张三"; student1.ID = "0001"; student1.age = 20; student1.sex = '男';//对变量进行赋值 //等价于用有参构造进行对象初始化 Student student2 = new Student("张三", "0001", 20, '男'); } }
-
注意事项
- 当类中没有构造函数的时候,系统会默认给出一个无参构造,是类中默认的构造函数,如果定义了自己的构造函数,系统不再提供默认无参构造
- 在类中可以定义多个构造函数(是通过重载形式体现的,因为构造方法的名字都相同),用来进行不同的初始化
3. 构造方法与普通方法的区别
- 定义内容:构造方法定义的是对象在创建之初就应该具备的内容,也就是对象的初始化内容;而普通方法用于定义对象的功能
- 调用时间不同:构造方法是由JVM调用,给对象初始化;而普通方法是在对象建立后,当对象调用方法时才执行
- 调用次数不同:构造方法只在对象创建时调用一次;普通方法可以被调用多次
- 命名不同:构造方法必须和类名同名;而普通方法只需符合命名规范即可
- 返回值:构造方法没有返回值;普通方法可以有返回值
4. 举例
- 定义一个长方形(Rectangle)类,求周长和面积
public class Rectangle {
private double length;
private double width;
public Rectangle() {//无参构造,建议显式给出
}
public Rectangle(double length, double width) {//有参构造
this.length = length;
this.width = width;
}
public void perimeter() {//输出周长
System.out.println("周长是:" + 2 * (this.length + this.width));
}
public void area() {//输出面积
System.out.println("面积是:" + this.length * this.width);
}
}
public class RectangleTest {//测试类
public static void main(String[] args) {
Rectangle rectangle = new Rectangle(4, 5);//创建对象并初始化
rectangle.perimeter();//输出周长
rectangle.area();//输出面积
}
}
二、static关键字
1. 含义及特点
- 含义
意为静态的,被static关键字所修饰的成员用来对类进行修饰和初始化,随着类的加载而加载,可以用来修饰成员变量和成员方法,被修饰的成员变量是所有本类对象所共有的,比如说一个专业所有学生的专业是一样的,那专业代码就可以设置成static的,为专业所有学生共有 - 特点
- 随着类的加载而加载,只加载一次
- 优先于对象存在,被static修饰的成员是和类一起加载的,比对象先存在
- 被类的所有成员共享
- 可以通过类名直接调用,也可以通过对象名调用,但推荐使用类名调用,表示为类的成员
2. 注意事项
- 静态的只能访问静态的
因为静态成员是随着类的加载而加载的,此时还没有对象的存在,非静态的成员还未加载,在静态中访问还未加载的非静态成员就会访问不到 - 非静态的可以访问静态的,也可以访问非静态的
静态成员早于非静态成员(对象)出现,此时静态成员早已加载好,所以在非静态成员中访问静态成员,也可以访问非静态成员
3. 静态变量和成员变量的区别
- 所属不同
静态变量属于类,而成员变量属于对象 - 内存中位置不同
静态变量在方法区的静态区,而成员变量在堆区的对象中 - 出现时间不同
静态变量是随着类的加载而加载的,随着类的消失而消失;成员变量随着对象的加载而加载,随着对象的消失而消失 - 调用方法不同
静态变量可以通过类名或对象名进行调用,而成员变量只能通过变量名调用
三、Math类的随机数功能
1. Math类概述
- Math类包含用于执行基本数学运算的方法
- 特点
- java.lang包下的内容不需要我们手动导入,其他包下的内容需要手动导入,Math类在java.lang包下,所以不需要导包
- 无构造方法,因为Math成员都是静态的,随着Math类的加载而加载,不需要构造方法来实例对象
- 获取随机数的方法
- Math.random();
- 返回一个大于等于零且小于1的double类型的浮点数
2. 猜数字小游戏
-
猜1-100间随机数,5次机会
public class GuessTheNumberGame { public static void main(String[] args) { int num = (int) (Math.random() * 100 + 1);//产生随机数 System.out.println("请输入你猜的数,你有5次机会"); int sum = 0;//用来统计用户输入次数,满五次程序自动退出 while (true) { if (sum >= 5) { System.out.println("5次机会已用完,游戏结束"); break; } int usenum = input();//接收用户输入的数 if (usenum > num) {//进行比较,大于随机数就提示大了 System.out.println("你猜大了"); } else if (usenum < num) {//进行比较,小于随机数就提示小了 System.out.println("你猜小了"); } else {//进行比较,等于随机数就提示成功,并结束游戏 System.out.println("恭喜你,猜对了"); break; } sum++; } } private static int input() {//得到用户输入的数据 Scanner in = new Scanner(System.in); return in.nextInt(); } }