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;
}
}
静态导入
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.8
到5.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 + " 个");
}
}