Java基础知识 09(static关键字,Math类,面向对象—代码块)

Java基础知识 09

static关键字
static:静态的,可以修饰成员变量,也可以修饰成员方法,static修饰成员变量,此变量就为一个共享变量,会被该类的所有对象所共享。
static关键字特点:(1)随着类的加载而加载。(2)优先于对象而存在。(3)被类的所有对象所共享。
如果某个成员变量是被所有对象共享的,那么他就应该被定义成静态的。
对于静态所修饰的成员,推荐使用 类名 调用。被静态修饰的成员属于类,推荐使用类名直接调用。
案例程序分析1:
public class Person {
    String name;
    //static:静态的 可以修饰成员变量也可以修饰成员方法
    //static修饰成员变量,此变量就为一个共享变量,会被该类的 所有对象所共享。
    public static String guoji="中国";
}
public class test {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name="张三";
        //被静态修饰的成员属于类,推荐使用类名直接调用。无需new对象来调用。当然对象可以调用,但是不推荐。
        Person.guoji="美国";
        Person p2 = new Person();
        p2.name="李四";

        Person p3 = new Person();
        p3.name="王五";
        //被静态修饰的成员属于类,推荐使用类名直接调用。无需new对象来调用。当然对象可以调用,但是不推荐。
        Person.guoji="英国";
        System.out.println(p1.name);//张三
        System.out.println(p1.guoji);英国
        System.out.println("-----------------");
        System.out.println(p2.name);//李四
        System.out.println(p2.guoji);//英国
        System.out.println("-----------------");
        System.out.println(p3.name);//王五
        System.out.println(p3.guoji);//英国
    }
}

static内存图:
在这里插入图片描述

静态的方法中,访问不到非静态的数据,静态方法中只能访问静态修饰的成员。
静态修饰的成员,随着类的加载而加载,优先于对象存在,先存在访问不到后存在的。
非静态的方法中,既能访问静态的,也能访问非静态的。
静态方法中,只能访问静态变量,也只能调用静态方法。
静态方法中不能出现this,this代表一个对象,对象是后来才有的,先有的不能访问后有的。
主方法是静态修饰的,主方法中可以直接调用静态方法。
主类,只是提供程序的入口,一般不会在主类中提供成员变量和成员方法。
案例程序分析2:
public class test {
}
class student{
    String name="张三";
    public static int age=35;
    //非静态方法
    public void teacher(){
        System.out.println(name);
        System.out.println(age);
    }
    //静态方法
    public static void doctor(){
        System.out.println(age);
        //System.out.println(name);
    }
    //非静态方法调用成员方法
    public void siji(){
        System.out.println("司机");
        this.teacher();
        doctor();
    }
    public static void hushi(){
        System.out.println("护士");
        //teacher();
        doctor();
        //静态方法中不能加this
        //this.teacher();
    }
}
成员变量和静态变量的区别:
成员变量属于对象,随着对象的创建而产生,随着对象的销毁而销毁,成员变量,也叫实例变量,对象变量。
静态变量属于类,随着类的加载而产生的,随着类的销毁而销毁,静态变量也叫做类变量。
成员变量存储在堆内存,静态变量存储在方法区的静态区;成员变量通过对象来调用,静态变量通过类名来调用,当然静态变量也可以通过对象来调用,但是不推荐啊。
案例程序分析3:
public class test2 {
    //成员变量
    String name="张三";
    static double num=20;

    public static void main(String[] args) {
        test2.student();        //1.学生
        student();			//2.学生
        //test2.teacher();
        test2 t = new test2();//new新对象
        t.teacher();        //3.老师
        System.out.println(num);  //4.20.0
        System.out.println(t.name);   //5.张三
    }
    public static void student(){
        System.out.println("学生");
    }
    public void teacher(){
        System.out.println("老师");
    }
}
Math类
Math:是一个关于数学运算方面的类,它的成员变量和成员方法,全部都是static修饰的,使用类名可以直接调用。
//私有化构造,外界不能再new对象
Math.random();//随机生成一个小数,范围大于小于。
	for(int i=0;i<100;i++){
        double num=math.random();
        System.out.println(num);
	}
案例程序分析4:
package org.westos.demo2;

import java.util.Scanner;

public class GuessNumberGame {
    public static void main(String[] args) {
        int num=(int)((Math.random()*100)+1);
        //只给用户5次机会,每次输入完还得显示剩余次数。
        //5次机会用完直接关闭。
        Scanner sc = new Scanner(System.in);
        int j=5;
        while(true){
                System.out.println("请猜一个整数,1---100");
                System.out.println("还剩余"+j+"次机会");
                j--;
                int unum = sc.nextInt();
                if(unum>num){
                    System.out.println("猜大了。");
                }else if(unum<num){
                    System.out.println("猜小了。");
                }else{
                    System.out.println("恭喜你,猜对了!!!");
                    break;
                }
                if(j==0){
                    System.out.println("对不起,您的次数已用完!");
                    break;
                }
            }
        }
    }
上节课this关键字,构造方法例题回顾:
/*A:案例演示
    需求:定义一个员工(Employee)类,自己分析出几个成员,
    然后给出成员变量,构造方法,getXxx()/setXxx()方法,
    以及一个显示所有成员信息的方法。并测试。*/
public class Employee {
    /*A:案例演示
    需求:定义一个员工(Employee)类,自己分析出几个成员,
    然后给出成员变量,构造方法,getXxx()/setXxx()方法,
    以及一个显示所有成员信息的方法。并测试。*/
    private String name;
    private int JobNumber;
    private double InCome;
    public Employee(){
    }
    public Employee(String name,int JobNumber,double InCome){
        this.name=name;
        this.JobNumber=JobNumber;
        this.InCome=InCome;
    }
    public void setName(String name){
        this.name=name;
    }
    public void setJobNumber(int JobNumber){
        this.JobNumber=JobNumber;
    }
    public void setInCome(double InCome){
        this.InCome=InCome;
    }
    public String getName() {
        return name;
    }
    public  int getJobNumber() {
        return JobNumber;
    }
    public double getInCome() {
        return InCome;
    }
}
---------------------------------------------
public class test {
    /*A:案例演示
    需求:定义一个员工(Employee)类,自己分析出几个成员,
    然后给出成员变量,构造方法,getXxx()/setXxx()方法,
    以及一个显示所有成员信息的方法。并测试。*/
    public static void main(String[] args) {
        Employee employee = new Employee();
        employee.setName("张三");
        employee.setJobNumber(152027);
        employee.setInCome(8888.888);
        String name = employee.getName();
        int JobNumber = employee.getJobNumber();
        double InCome = employee.getInCome();
        System.out.println(name);
        System.out.println(JobNumber);
        System.out.println(InCome);
        System.out.println("----------------------");
        Employee employee1 = new Employee("李四", 152028, 6666.666);
        String name1 = employee1.getName();
        int JobNumber1 = employee1.getJobNumber();
        double InCome1 = employee1.getInCome();
        System.out.println(name1);
        System.out.println(JobNumber1);
        System.out.println(InCome1);
    }
}
面向对象—代码块
代码块:就是被一对{}所括起来的内容。
代码块根据定义位置的不同可以分为:局部代码块,构造代码块,静态代码块,同步代码块(后面讲)。
局部代码块:在方法中出现,限定变量生命周期,及早释放,提高内存利用率。
构造代码块:我们在创建对象时,就会使用构造代码块,而且构造代码块是优先于构造方法执行的。
		  每次创建对象,构造代码块都会执行。
静态代码块:静态修饰的,是随着类的加载而加载。
		  用于给类进行初始化,在虚拟机加载类的时候就会加载执行,并且只执行一次。
静态代码块是自动执行的,而静态方法是被调用的时候才执行的。
案例程序分析5:
public class student {
    public student(){
        System.out.println("构造方法执行了");
    }
    //跟构造方法同级的构造代码块
    {
        System.out.println("构造代码块执行了");
    }
    //静态代码块
    //静态修饰的,是随着类的加载而加载  Student.class
    //******用于给类进行初始化,在加载的时候就执行,并且只执行一次******
    static {
        System.out.println("我们在类加载的时候,就可以在静态代码块里面,编写代码,做一些准备工作");
        System.out.println("静态代码块");
    }
}
package org.westos.demo;

import java.util.Scanner;

public class MyTest {
    public static void main(String[] args) {
        //局部代码块
        int num=20;
        {
            int num1=200;
            Scanner scanner = new Scanner(System.in);
            System.out.println("局部代码块");
            System.out.println(num1);
        }
        //构造代码块
        System.out.println("--------------------------");
        student student = new student();
        student student1 = new student();
    }
}
上面这段代码涉及到一个构造方法,构造代码块,静态代码块的执行顺序问题:
		静态代码块 > 构造代码块 > 构造方法
案例程序分析6:
class Student {
    static {
        System.out.println("Student 静态代码块"); //3 只执行一次
    }
    {
        System.out.println("Student 构造代码块"); //4 6
    }

    public Student() {
        System.out.println("Student 构造方法"); //5 7
    }
}
class StudentDemo {
    static {
        System.out.println("StudentDemo的静态代码块"); //1
    }
    public static void main(String[] args) {
        System.out.println("我是main方法"); //2
        Student s1 = new Student();
        Student s2 = new Student();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值