10 static、数组工具类

lix_uan
• 阅读 973

static

  • 一个成员修饰符,可以用来修饰成员变量、成员方法、成员内部类、代码块
  • 被修饰的成员是属于类的,而不是单单属于某个对象的,既然属于类,就可以不靠创建对象来调用了

静态方法

  • static修饰的成员方法,称为类方法、静态方法

语法格式

【其他修饰符】 static 返回值类型 方法名 (【形参列表】){ 
    // 执行语句 
}

特征

  • 在本类中,静态方法可以直接访问静态方法和静态变量
  • 在其他类中,可以使用”类名.方法“进行调用
  • 静态方法中,不能出现this,也不能直接使用本类的非静态成员,相反,非静态的实例成员方法可以直接访问静态的类变量或静态方法
  • 静态方法只能访问静态成员。至于this、非静态成员,这些都是需要创建对象时才能使用的,而静态方法调用时,可能没有对象

示例

public class Test{
    public static void main(String[] args){
        Son s = new Son();
        s.fun();//有警告,没错误

        Son.fun();
    }
}

class Son{
    private int a;    
    public static void fun(){
//        method();//错误的
//        System.out.println(a);//错误
//        System.out.println(this.a);//错误

        System.out.println("Son:fun()");
    }
    public void method(){
        System.out.println("Son:method()");
    }
}

静态变量

  • static修饰的成员变量,称为类变量、静态变量

特征

  • 该成员变量的值是该类所有对象共享的
  • 该变量的值和类信息一起存在于方法区中
  • 它的get/set也是static的
  • 在static方法中,如果有局部变量与类变量重名时,使用”类名.成员变量进行区别“

示例

public class Test{
    public static void main(String[] args){
        Chinese c1 = new Chinese("张三");
        Chinese c2 = new Chinese("李四");
        System.out.println("国家名:" + c1.getCountry() + ",姓名:" + c1.getName());
        System.out.println("国家名:" + c2.getCountry() + ",姓名:" + c2.getName());

        c1.setCountry("中国");//两个对象共享,一个对象修改,会影响另一个对象
        System.out.println("国家名:" + c1.getCountry() + ",姓名:" + c1.getName());
        System.out.println("国家名:" + c2.getCountry() + ",姓名:" + c2.getName());

        Chinese.setCountry("China");//通过“类名.”访问可读性更好
        System.out.println("国家名:" + c1.getCountry() + ",姓名:" + c1.getName());
        System.out.println("国家名:" + c2.getCountry() + ",姓名:" + c2.getName());
    }
}
class Chinese{
    private static String country = "中华人民共和国";
    private String name;

    public Chinese(String name) {
        super();
        this.name = name;
    }

    public static String getCountry() {
        return country;
    }

    public static void setCountry(String country) {
        Chinese.country = country;//类名.静态变量来区别区别同名变量
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }     
}

10 static、数组工具类

静态导入

  • JDK1.5引入静态导入

    package com.atguigu.test;
    
    import static java.lang.Math.*;
    
    public class Test{
        public static void main(String[] args){
            System.out.println("PI:" + Math.PI);
            System.out.println("平方根:" + Math.sqrt(4));
            System.out.println("随机数:" + Math.random());
    
            //有静态导入,可以简写如下
            System.out.println("PI:" + PI);
            System.out.println("平方根:" + sqrt(4));
            System.out.println("随机数:" + random());
        }
    }

变量的分类与区别详解

按照数据类型区分

int a = 10;//a中存储的是数据值

Student stu = new Student();//stu存储的是对象的地址值
int[] arr = new int[5];//arr存储的是数组对象的地址值
String str = "hello";//str存储的是"hello"对象的地址值

按照声明的位置不同

class Person{
    private static String country = "中华人民共和国";//成员变量,静态成员变量,类变量,"中华人民共和国"是常量值
    private String name;////成员变量,非静态成员变量,实例变量
    public Person(String name) {//name 局部变量
        this.name = name;//=左边带this.的是成员变量,=右边没有this.的是局部变量
    }
    public Person() {
    }
    public static String getCountry() {
        return country;//成员变量
    }
    public static void setCountry(String country) {//局部变量
        Person.country = country;//=左边带类名.的是成员变量,=右边是局部变量
    }
    public String getName() {
        return name;//成员变量
    }
    public void setName(String name) {//局部变量
        this.name = name;//=左边带this.的是成员变量,=右边是局部变量
    }
}
public class Test{
    public static void main(String[] args){//args局部变量
        String n1 = "张三";//n1局部变量,"张三"是常量值
        Person p1 = new Person(n1);//p1局部变量

        String n2 = "李四";//n2局部变量,"李四"是常量值
        Person p2 = new Person(n2);//p2局部变量

        p1.setName("张三丰");//"张三丰"是常量值

        Person.setCountry("中国");//"中国"是常量值
    }
}

成员变量与局部变量的区别

  • 声明的位置不同
    • 成员变量:类中方法外
    • 局部变量:方法的()中,即形参;方法体中;代码块中
  • 存储的位置不同
    • 成员变量:静态变量(类变量)在方法区中,实例变量在堆中
    • 局部变量:栈中
  • 修饰符不同
    • 成员变量:4种权限修饰符、static等多种修饰符
    • 局部变量:不能有任何修饰符
  • 作用域不同
    • 成员变量:静态变量在本类中随便使用,在其他类中通过类名.调用;非静态变量在本类中只能在非静态成员中使用,在其他类中通过对象名.调用
    • 局部变量:出了作用域就不能使用了
  • 生命周期不同
    • 成员变量:和类相同
    • 局部变量:和方法相同

数组工具类Arrays

static int binarySearch(int[] a, int key) :

  • 要求数组有序,在数组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数

static int[] copyOf(int[] original, int newLength) :

  • 根据original原数组复制一个长度为newLength的新数组,并返回新数组

static int[] copyOfRange(int[] original, int from, int to) :

  • 复制original原数组的[from,to)构成新数组,并返回新数组

static boolean equals(int[] a, int[] a2) :

  • 比较两个数组的长度、元素是否完全相同

static void fill(int[] a, int val) :

  • 用val填充整个a数组

static void fill(int[] a, int fromIndex, int toIndex, int val):

  • 将a数组[fromIndex,toIndex)部分填充为val

static void sort(int[] a) :

  • 将a数组按照从小到大进行排序

static void sort(int[] a, int fromIndex, int toIndex) :

  • 将a数组的[fromIndex, toIndex)部分按照升序排列

static String toString(int[] a) :

  • 把a数组的元素,拼接为一个字符串,形式为:[元素1,元素2,元素3。。。]

系统类System的几个方法

static long currentTimeMillis() :

  • 返回当前系统时间距离1970-1-1 0:0:0的毫秒值

static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):

  • 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。常用于数组的插入和删除

static void exit(int status) :

  • 退出当前系统

static void gc() :

  • 运行垃圾回收器。

数学类Math

public static double abs(double a) :

  • 返回 double 值的绝对值。

public static double ceil(double a):

  • 返回大于等于参数的最小的整数。

public static double floor(double a) :

  • 返回小于等于参数最大的整数。

public static long round(double a) :

  • 返回最接近参数的 long。(相当于四舍五入方法)

public static double pow(double a,double b):

  • 返回a的b幂次方法

public static double sqrt(double a):

  • 返回a的平方根

public static double random():

  • 返回[0,1)的随机值

public static final double PI:

  • 返回圆周率

public static double max(double x, double y):

  • 返回x,y中的最大值

public static double min(double x, double y):

  • 返回x,y中的最小值

计算在 -10.85.9 之间,绝对值大于6 或者小于2.1 的整数有多少个

public class MathTest {
  public static void main(String[] args) {
    // 定义最小值
    double min = -10.8;
    // 定义最大值
    double max = 5.9;
    // 定义变量计数
    int count = 0;
    // 范围内循环
    for (double i = Math.ceil(min); i <= max; i++) {
      // 获取绝对值并判断
      if (Math.abs(i) > 6 || Math.abs(i) < 2.1) {
        // 计数
        count++;
      }
    }
    System.out.println("个数为: " + count + " 个");
  }
}
点赞
收藏
评论区
推荐文章

暂无数据

lix_uan
lix_uan
Lv1
学无止境,即刻前行
文章
7
粉丝
5
获赞
0