函数名前有无static关键词修饰的区别
引入
在定义函数时,前面有时会有static关键字,有时却没有,static关键字在定义函数时是有它的作用的。一般情况我们很少去给自定义方法用static修饰,防止变量或方法被滥用。
static修饰特点
- 加了static关键字的方法,不可调用该类中的非静态成员和非静态方法;顺便在这里提一句非静态成员变量和非静态方法,非静态成员方法可以调用非静态成员和静态成员,即非静态成员方法无限制(这里是指同一类下);
- 加了static关键字后,不需要生成示例对象就可以直接调用成员,也就是此时这个静态成员(不论是变量还是方法)被该类创建的对象共享;
- 加了static关键字的函数中,不能使用super关键字对父类中的成员进行调用(与第一点对应);
代码示例
代码1(对应第1点)
public class Student {//定义的Student类
public String name; //非静态成员变量
public static int age; //静态成员变量
public void show1() {
}//非静态成员方法
public void show2() {
name = "Mye";
age = 20;
show1();
show3();
}//非静态成员方法调用非静态成员和静态成员
public static void show3() {
}//静态成员方法
public static void show4() {
// name = "Mye"; 无法调用,注释掉
age = 20;
// show1(); 无法调用,注释掉
// show2(); 无法调用,注释掉
show3();
}//静态成员方法调用静态成员变量和静态成员方法
}
代码2(对应第2点)
学生类
public class Student { //学生类 包含姓名 年龄 学校
public String name;
public int age;
public static String university; //学校是static修饰
// static使该成员变量让所有对象共享
// 赋值方式发生改变 Student.university = "";
// 可以通过类名调用、对象名调用
public void show() {
System.out.println(name+" "+age+" "+university);
}
}
main方法
public static void main(String[] args) {
Student s1 = new Student();
Student.university = "AYGXY";
s1.name = "LQX";
s1.age = 30;
s1.show();
Student s2 = new Student();
s2.name = "FQY";
s2.age = 33;
// s2.university = "AYGXY";
s2.show();
}
输出结果
LQX 30 AYGXY
FQY 33 AYGXY
代码3(对应第3点)
父类
public class Fu {
public int age =40;
public Fu() {
System.out.println("父类的构造方法!");
}
}
子类(包含了main方法)
public class Zi extends Fu{
public int age =20;
public static int length;
// 定义一个静态成员用来测试
public static void test01() {
length=10;
// 可以使用静态成员length
// System.out.println(super.age);//此处会报错 我们注释掉
// 静态函数不能使用super关键字调用父类成员
}
public void test02() {
System.out.println(super.age);
// 非静态函数中可以使用super关键字调用父类成员
}
public static void main(String[] args) {
Zi z = new Zi();
// z.test01(); 此处会报错 我们注释掉
z.test02();
}
}
总结
static一般多用于类的静态成员变量或方法的共享,能够在不创建类的对象的条件下,达到引用变量或者方法的目的;
同一类下,static修饰的方法内,只能使用静态变量或方法;不同类下,如果通过静态方法使用非静态的就必须实例化对象,再通过对象进行访问,比如我们常见的在main方法中就是使用这种做法;