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修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。