zoukankan      html  css  js  c++  java
  • 类变量,静态方法和其他变量和方法在调用时的区别

    1:静态变量(类变量)和其他变量在调用时的区别:

    类变量赋值方法

    类变量赋值可以采用类名.变量名的方法在下面两种规则中赋值,注意类变量不能用实例化出来的对象调用,因此也不能通过对象.变量名的方法赋值

    • 无final修饰,声明时赋值,构造器中赋值,静态语句块或静态方法赋值
    • 有final修饰,声明时赋值,声明与赋值分开可在静态语句(就是)块中赋值(一般static都是和final一起使用)

    普通变量赋值则不能类名.变量名来对变量进行调用赋值,其他的赋值方式与static不带final一样,二者表面的区别只有格式不一样(也就是不带final的类变量比实例变量多了一种访问方式)

    class A{

      public static String a;

      private String b;

      public A(String a){

      this.b = a;//实例变量通过构造函数赋值;

      }

      public static void main(){

      A a = new A("sadasd");//实例变量b通过构造函数赋值

      A.a = "sdad";//类变量通过类名.变量名直接赋值,也可以以这种方式来访问类变量

      

      }

    }

    还需要注意的是类变量与实例变量作用范围的不同:

    实例变量:

    • 当一个对象被实例化之后,每个实例变量的值就跟着确定;
    • 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;

    类变量:

    • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
    • 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
    • 静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
    • 静态变量在程序开始时创建,在程序结束时销毁。

    2:静态方法和普通方法的区别:

    1、在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

    2、静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

    3、程序的static块只能调用静态方法,不能调用实例的方法。

    如果要追溯其区别的根源,可以这样理解:在编译期间静态方法的行为就已经确定,而实例方法只有在运行期间当实例确定之后才能确定。
    关于类变量,静态方法和普通变量和方法的区别,我们这里有一个列子可以帮助理解(仁者见仁,智者见智)
    在People类中:
    package com.earth.people;
    
    public class People {
        private String nation;//这些是每个对象都有,但是不同对象拥有不同值的属性,所以应该用实例变量来声明
        private double avageSalary;
        private double avagehigh;
        private String skingColor;
        //地球人是每个人都拥有的属性,但是这个属性所有人类对象都是一样的,所以可以用类变量来说声明
        public static String earth;
        public String getNation() {
            return nation;
        }
        public void setNation(String nation) {
            this.nation = nation;
        }
        public double getAvageSalary() {
            return avageSalary;
        }
        public void setAvageSalary(double avageSalary) {
            this.avageSalary = avageSalary;
        }
        public double getAvagehigh() {
            return avagehigh;
        }
        public void setAvagehigh(double avagehigh) {
            this.avagehigh = avagehigh;
        }
        public String getSkingColor() {
            return skingColor;
        }
        public void setSkingColor(String skingColor) {
            this.skingColor = skingColor;
        }
        public static final void protectEarth() {//这个可以理解为保护地球方法是全人类都应该做的,而不应该某一个对象应该做的,所以可以声明为类方法
            System.out.println( "plant tree and decline pollution");
        }
    
    }
    在ChinesePeople类中:
    public class ChinesePeople {
        public static void main(String[] args) {
            People chinese = new People();
            People england = new People();
            People american = new People();
            People.protectEarth();
            chinese.protectEarth();//这两种都可以
            People.earth = "绿色地球";//静态类可以用这种方法来访问,但是不能用chinese.earth来访问,就相当于星球这个属性只能由整个人类来定义,以整个人类的名义访问,不能说某一个人或某一种人就能够定义;
        }
    
    }

    此例也可以用于以后在在创建对象时帮助确定静态变量,而且由此可以看出java的面向对象编程的特性,以后在编程中要结合生活中的常识规律才可以成为一个好的程序员

    3:还有一个小细节,此前一直没有注意过:

    例如:

    class a{

      int i;

      i=5;//这句是再次赋值,是是一个语句

      }

    这个代码是会报错的;原因是类体中只能出现变量和方法,类体变量在声明的时候如果你没有赋值,那么系统就会为你的变量赋一个默认值,数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。
    而你在下面在在为其赋值就相当于一个语句,而语句不能直接出现在类体中,只能出现在方法体和静态语句块(就是{})中,如果这样改就可以使用:
    class a{
      int i;
      {
      i=5;
      }
      }

    将i=5放到一个静态代码块中就可以执行了





  • 相关阅读:
    JavaScript条件判断和循环
    JavaScript数据类型详解
    Dockerfile使用
    让ie8、ie9支持媒体查询
    事件穿透
    判断是苹果手机还是安卓手机
    ES6中字符串的扩展
    ES6数组的扩展运算符
    let和const
    ES6中函数的扩展
  • 原文地址:https://www.cnblogs.com/shendaxia1/p/9215319.html
Copyright © 2011-2022 走看看