Java学习第九天-----static关键字、静态变量和成员变量的区别、Math类的随机数功能、代码块
1.static关键字:
a:随着类的加载而加载
b:所修饰的成员优先于对象存在
c:被类的所有对象共享
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
d:可以通过类名调用
其实它本身也可以通过对象名调用。
推荐使用类名调用。
静态修饰的内容一般我们称其为:与类相关的,类成员
static关键字的注意事项:
a:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
b:静态方法只能访问静态的成员变量和静态的成员方法
静态只能访问静态,非静态可以访问静态的也可以访问非静态的
2.案例演示1:
public class MyTest {
public static void main(String[] args) {
/* A:
static关键字的特点
a:随着类的加载而加载
b:优先于对象存在 对象是你后来new出来
c:被类的所有对象共享*/
// 对于静态所修饰的成员,推荐使用类名调用。
Student student=new Student();
String name = student.name;
int num = student.num;//不推荐这样调用 这样是对象调用 不是类名调用
System.out.println("=============================");
int num1 = Student.num;
System.out.println(num1);
}
}
class Student{
String name;
static int num=200;
}
3.案例演示2:
class Student{
String name="张三";
static int num=100;
//非静态方法中,既能访问静态的,也能访问非静态的
public void show(){
System.out.println(name);
System.out.println(num);
}
//静态方法
//静态的方法中,访问不到非静态的数据,静态方法中只能访问静态修饰的成员。
//静态修饰的成员,随着类的加载而加载,优先于对象存在。先存在,访问不到后存在的
public static void test(){
System.out.println(num);
//System.out.println(name);//报错
}
//非静态的方法中,既可以调用非静态方法,也可以调用静态
public static void haha(){
System.out.println("哈哈");
System.out.println(num);
test();
//show();//报错
}
//静态方法中,只能访问静态变量,也只能调用静态方法
public static void haha2(){
System.out.println("哈哈2");
System.out.println(num);
//静态方法中不能出现this
//this 代表一个对象,对象是后来才有的,静态是优先于对象而存在的 。
//System.out.println(this.name);//报错
//this.show();//报错
}
}
4.案例演示3:
public class MyTest2 {
static int num=100;
double aa=200;
public static void main(String[] args) {
MyTest2.show();//静态的方法可以通过类名来调用
show();//也可以直接调用 因为主方法中也是static修饰的
MyTest2 myTest2 = new MyTest2();
myTest2.show2();//非静态的方法就必须通过对象来调用
System.out.println(num);
System.out.println(myTest2.aa);//非静态的成员变量也必须通过对象来调用
}
//成员方法
public static void show(){
System.out.println("show方法");
}
public void show2(){
System.out.println("show2方法2222");
}
}
5.静态变量和成员变量之间的区别:
A:所属不同
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
B:内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
C:内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
D:调用不同
静态变量可以通过类名调用,也可以通过对象调用,推荐使用类名调用
成员变量只能通过对象名调用
6.Math类的随机数功能:
Math类概述:该类包含用于执行基本数学运算的方法
Math类的特点:由于Math类在java.lang包下,所以不需要导包。
Math类没有构造方法,因为它的成员全部是静态的。
Math类中获取随机数的方法:
public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
7.小游戏案例:
猜五次数字1-100 每次猜错会提示剩余次数
public class GuessNumberGame {
public static void main(String[] args) {
int num=(int)((Math.random()*100)+1);
Scanner scanner = new Scanner(System.in);
int i=5;
do{
System.out.println("请猜一个整数 1-100");
int unum=scanner.nextInt();
if(unum>num){
System.out.println("猜大了");
System.out.println("还剩"+(i-1)+"次机会");
i--;
}else if(unum<num){
System.out.println("猜小了");
System.out.println("还剩"+(i-1)+"次机会");
i--;
}else{
System.out.println("恭喜你!猜对了");
break;
}
}while(i>0);
}
}
8.代码块:在Java中,使用{}括起来的代码被称为代码块。
代码块的分类:根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)
局部代码块:
在方法中出现;限定变量生命周期,及早释放,提高内存利用率
构造代码块:
在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
静态代码块:
在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。