七 构造方法、static关键字、创建对象过程及Math类随机数功能
一. 主要内容
二. 构造方法
什么是构造方法?构造方法的格式有什么特点?
答:构造方法就是创建对象,给对象中的成员进行初始化。
格式特点:
a:方法名与类名相同
b:没有返回值类型,连void都没有
c:没有具体的返回值
2.1 构造方法重载(重要)
在这里,我们需要注意的是,在构造方法的过程中。
a:若我们没有给出构造方法,系统将自动提供一个无参构造方法。
b:若我们给出了构造方法,系统将不再提供默认的无参构造方法。
NOTE:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
三. 创建一个对象的步骤(重要)
在这里我们以手机类为例,来探讨创建对象的过程
Phone p= new Phone();
步骤:
(0)加载测试类的字节码文件进内存的方法区,加载main方法进栈
(1):加载Phone.class文件进内存
(2):在栈内存为p开辟空间
(3):在堆内存为手机对象开辟空间
(4):对手机对象的成员变量进行默认初始化
(5):对手机对象的成员变量进行显示初始化
(6):通过构造方法对手机对象的成员变量赋值
(7):手机对象初始化完毕,把对象地址赋值给p变量
四. static关键字
4.1 static关键字的特点
a:随着类的加载而加载
b:优先于对象存在
c:被类的所有对象共享
其实static关键字很好理解,比如我们共同使用一个大学名称或者我们共同使用一个专业。所以,我们可以知道:如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
d:可以通过类名调用
其实它本身也可以通过对象名调用。
我们推荐使用类名调用。
静态修饰的内容一般我们称其为:与类相关的,类成员
4.2 使用static注意问题
a:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
b:静态方法只能访问静态的成员变量和静态的成员方法
简单记:静态只能访问静态,非静态可以访问静态的也可以访问非静态的
4.3 静态变量与成员变量
A:所属不同
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
B:内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
C:内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
D:调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
4.4 static关键字应用举例
这是作业当中的一个改错题:
class Demo {
int x;
String s;
float f;
boolean[] b = new boolean[5];
public static void main(String[] args){
System.out.println(x);
System.out.println(s);
System.out.println(f);
System.out.println(b[2]);
}
}
有错误。考察了static的使用方法。因为在main方法外,所定义的变量均为非静态变量,所以需要将非静态变量变为静态变量即可。最终修改为:
public class Demo {
static int x;
static String s;
static float f;
static boolean[] b = new boolean[5];
public static void main(String[] args){
System.out.println( x);
System.out.println(s);
System.out.println(f);
System.out.println(b[2]);
}
}
最终输出结果为:
0
null
0.0
false
五. Math类随机数功能
先看一个具体的实例,完成猜数字大小的小游戏
import java.util.Scanner;
public class GuessNum {
public static void main(String[] args) {
int randn =(int) ((Math.random() * 100) + 1);
// System.out.println(randn);
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请输入一个1到100的整数");
int rnum = sc.nextInt();
if(rnum<0||rnum>100){
System.out.println("请重新输入");
}
else if(rnum>randn){
System.out.println("您输入的数大了");
}
else if(rnum<randn){
System.out.println("您输入的数小了");
}
else if(rnum==randn){
System.out.println("输入正确");
break;
}
}
}
}
A:Math类概述
类包含用于执行基本数学运算的方法
B:Math类特点
由于Math类在java.lang包下,所以不需要导包。
没有构造方法,因为它的成员全部是静态的。
C:获取随机数的方法
public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
D:要获取一个1-100之间的随机数,怎么解决?
int number = (int)(Math.random()*100)+1;