static修饰符:
静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。(源自:Java 修饰符 | 菜鸟教程 (runoob.com))
特点:
1.不属于某个具体对象,是所有对象所共享的,是类的一种属性。
2.既可以通过对象访问,也可以通过类名访问
3.存储在堆区,该类被卸载时给其分配的空间才会被回收。
4.生命周期于类同步
(更推荐使用类名调用,静态方法相同)
静态成员变量,一般不在构造方法中初始化,构造方法是与对象相关的实例属性,静态成员变量初始化一般为 一 、就地初始化即定义时直接给出初始值 二、在静态代码块中初始化
静态方法: static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据(源自:Java 修饰符 | 菜鸟教程 (runoob.com))
1.不属于某个具体的对象
2.可以通过对象调用,也可以通过类名调用。
3.静态方法中无 this 引用参数。不能访问任何非静态成员变量和任何非静态成员方法。
静态方法 斜体 显示 ,同样的静态方法也像类的属性一般。静态方法属于类,在编译类时已经被分配到内存的堆区的方法区中,而类的非静态方法却是属于对象的,每个对象都可以引用,若方法被重写,则引用子类重写的,这是运行时创建的,
(方法被加载时的顺序,一个方法被调用时,JVM首先检查是否为类方法,若是在类中找到并调用,不在确定是否被重写,若不是,正在执行其他操作)
而静态方法是不可以被重写但可以重载的,而是隐藏,若一个子类中定义了一个于父类静态方法中相同的方法,即方法名、返回值类型、参数名相同,则该类隐藏了父类的这个方法,静态方法看似被重写,实则是隐藏。
而其中子类若写一个非静态同名方法无法覆盖父类的静态方法,反过来也如此,父类中的方法是非静态的,子类不能写一个静态的同名方法,即静态不可覆盖,要么父子全静态,要么父子全非静态。
class A{
public static int a;
public A(){
}
public static void show(){
System.out.println("A:隐藏而非重写");
}
public static void show(int b){
System.out.println("A:可重载不可重写");
}
}
public class Demo1 extends A{
public Demo1() {
}
public static void show(){
System.out.println("Demo1:隐藏而非重写");
}
public static void show(int b,int c) {
System.out.println("Demo1:可重载不可重写");
}
public static void main(String[] args) {
Demo1 demo1 =new Demo1();
demo1.show();//没有重写时调用的时A的静态方法;
Demo1.show();//没有重写时调用的时A的静态方法;
Demo1.show(1,2);
A.show(1);
// A demo2 = new Demo1();
// demo2.show(1,2);
// demo2.show();
}
}
静态代码块:一般用于初始化静态成员变量
1.静态代码块不管生成多少个对象,只执行一次
2.如果一个类含有多个静态代码块,在编译时,编译器会按照先后次序依次合并在一个方法中,在类加载时被调用,并且只会执行一次。
指正,点赞 即加电子功德, 谢 谢。