Static关键字

# Static静态 #
public static void main

(1)类只是用来存储和被调用的,而对象是需要执行的,执行时就必定需要知道程序的入口,这个入口就是由main所在的位置。

(2)Java的类中没有main方法,因为它不需要执行,想执行需要自己加。

(3)Java所编写的程序是由其他程序来启动执行的(由某程序找到Java程序的入口,打开门后将操作的权限暂时交给Java程序,待到Java程序执行完毕再将权限收回),因此仅仅找到位置是不行的,还得有权限,如果没有权限,就像是你找到了门但是没有钥匙,一样进不了屋子。

(4)static的数据或方法,属于整个类的而不是属于某个对象的,是不会和类的任何对象实例联系到一起。所以子类和父类之间可以存在同名的static方法名,这里不涉及重载。所以不能把任何方法体内的变量声明为static,例如:
    
    fun() {
       static int i=0; //非法。
    }
    
static表示全局或者静态的意思, static修饰的变量和方法叫做静态变量和静态方法。

(5) Static 用来修饰哪些元素?  

   Static 修饰变量   ,静态变量,类变量  ,属于类所有,调用方式上  类名.变量名 ,(不推荐 对象名.变量名)

                静态变量位于方法区中,在 内存中只有1份,能够被类的所有实例所共享(类的所有对象共享这同一份资源,投票例子里共用同一个count)

   Static  修饰方法   ,静态方法,类方法     调用方式上   类名.方法名  (不推荐 对象名.方法名)

     普通方法既可以访问静态,也可以访问非静态的
     静态方法,只能访问静态的 ,不能访问非静态的 , 这条规律,不光针对变量,也针对方法 。 
    静态方法中,不允许出现this,super关键字

   Static  修饰代码块  , 静态代码块     jvm加载的时候自动执行的,而且只会执行1次,在new实例化之前就会被执行

    Static代码块可以有多个,自上而下执行,不管实例化多少次,都只会执行1次静态代码块
    静态代码块和普通代码块的区别  , 在new实例化之前执行,new实例化多少次,就会执行多少次 
  
Static  修饰内部类, 静态内部类`

 静态内部类中可以定义静态变量,静态方法  ,需要知道调用方式 
  
(6)    Static的内存图分析  


示例1:(无法直接调用方法,需要实例化)

    Person.showName();
示例2:

加static后可以使用Person.showName()

**总结:**

(1)静态方法可以直接通过类名调用,但静态方法内只能访问静态变量、只能调用静态方法。非静态可以调用静态。

(2)Main方法需要调用其他方法,所以自己必须在运行期间始终保持在内存中,所以使用static修饰。


**交叉比较区别:成员变量和静态变量的区别**

(1)两个变量的生命周期不同

成员变量随着对象的创建而存在,随着对象被回收而释放。

静态变量随着类的加载而存在,随着类的消失而消失。

注:加载顺序:启动类的static block最先加载

**子父类之间:**

(父类静态成员、静态代码块—>子类静态成员、静态代码块—>父类实例成员、非static代码块——>父类构造函数—>子类实例成员、非static代码块—>子类构造函数)

 单个类的执行顺序: 静态成员----》静态代码块 ----》实例成员----》普通代码块----》构造

(2)调用方式不同

成员变量只能被对象调用。

静态变量可以被对象调用,还可以被类名调用。

(3)别名不同

成员变量也称为实例变量。

静态变量也称为类变量。

**什么时候使用static,什么时候不用static?**

对静态变量的修改会被始终保留下来。创建两个人的对象,会导致密码相同。

举例说明

有违Java的面向对象的封装特性,增加的耦合。

多次使用某一个方法或变量的时候用static如数据库连接串等,因为static是在程序初始化时就已分配了内存空间,直到退出前才被释放出来,而new则是在变量进入作用域时被分配,离开时释放,每new时每创建一个类的实例,都会在内存中为非静态成员新分配一块存储,所以,常用的时候用static,只在程序初始化时分配内存空间,为各个类的实例所共用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域,所以常用方法或变量可以考虑用static,大型网站一般不推荐多用static因为他长时间的占用内存空间,另外static它不属于类的某一个具体的实例,而是属于类本身,所以其中不能用this等关键字,静态方法效率上要比实例化高,缺点是不能自行销毁,而实例化的可以自行销毁,网上有人说,static失去了面向对象的特性,这一点我认为是正确的,因为static不需要new根本就产生不了对象

posted @ 2019-04-15 20:15  佐半边的翅膀  阅读(132)  评论(0编辑  收藏  举报