一、Static关键字:

1.概述:Static是一个静态关键字;
2.使用:
a.修饰一个成员变量:
static 数据类型 变量名
b.修饰一个方法:
修饰符 static 返回值类型 方法名(形参){
方法体
return 结果
}
3.调用静态成员:
类名直接调用(不用new对象)
4.静态成员特点:
a.静态成员属于类成员,不属于对象成员(非静态的成员属于对象成员)
b.静态成员会随着类的加载而加载
c.静态成员优先于非静态成员存在在内存中
d.凡是根据静态成员所在类创建出来的对象,都可以共享这个静态成员
5.static关键字在程序运行中的内存占用情况:

jdk8及以后,静态区从方法区移动到堆内存中存放,原因是堆内存对于清理无效数据更高效,对内存的管理更合理。
6.静态成员访问特点
(1)在静态方法中能直接访问非静态成员嘛?------不能
想要调用的话:new对象调用
(2)在非静态方法中能直接访问静态成员嘛?------能
a.同类:
直接调用/类名调用
b.不同类:
类名调用
(3)静态方法中能直接访问静态成员嘛?------能
a.同类:
直接调用/类名调用
b.不同类:
类名调用
(4)非静态方法中能直接访问非静态成员嘛?------能
a.同类
直接调用/new对象调用
b.不同类:
new对象调用
总结:
(1)不管在不在同一个类中,非静态成员都可以new对象调用;
(2)不管在不在同一个类中,静态成员都可以类名调用。
7.静态成员在开发中的使用场景:
(1)既然static成员好用(类名直接调用,不用new对象调用),那么实际开发中,为什么不把所有成员都定义成静态的呢?
原因:因为静态成员会随着类的加载而加载,如果所有成员都是静态的,那么当类一加载,所有的成员都会进入内存,占用大量内存空间。
(2)那么静态成员什么时候定义呢?
一般情况下,我们在抽取工具类的时候可以将工具类中的所有成员都定义成静态的
(3)那么什么时候定义工具类呢?
如果有些功能在整个代码中重复实现,代码一样,实现功能一样,那就可以将这部分代码抽取出来,形成工具类。
8.可变参数:
(1)需求:定义一个方法,实现n个整数相加
(2)分析:方法参数位置,只明确了参数的类型,但是不明确参数个数,此时就可以定义成可变参数
(3)定义格式
数据类型...变量名
(4)注意:
a.可变参数的本质是一个数组;
b.参数位置不能连续写多个可变参数,而且当可变参数和其他普通参数一起使用时,可变参数需要放到数据列表的最后。
(5)可变参数的练习:
a.返回n个字符串拼接结果,如果没有传入字符串,那么返回空字符串""
java
public class ArrChanged {
public static void main(String[] args) {
String result = getString("野夫怒见不平事",",","磨损胸中万古刀");
System.out.println(result);
}
public static String getString(String...s){
String c = "";
for (int i = 0; i < s.length; i++) {
c += s[i];
}
return c;
}
}
b.n个字符串进行拼接,每个字符串之间使用某字符进行分隔,如果没有字符串,那么返回空字符串""
java
public class ArrChanged {
public static void main(String[] args) {
String result = getString("-","love","life","sky","robot");
System.out.println(result);
}
public static String getString(String regex,String...s){
String c = "";
for (int i = 0; i < s.length; i++) {
if ( i == s.length-1){
c += s[i];
}else {
c += s[i] + regex;
}
}
return c;
}
}