• JAVA面向对象学习——java面向对象概念——java变量类型


    Java 局部变量

    • 局部变量声明在方法、构造方法或者语句块中;
    • 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
    • 访问修饰符不能用于局部变量;
    • 局部变量只在声明它的方法、构造方法或者语句块中可见;
    • 局部变量是在栈上分配的。
    • 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。

    实例变量

    • 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
    • 当一个对象被实例化之后,每个实例变量的值就跟着确定;
    • 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
    • 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
    • 实例变量可以声明在使用前或者使用后;
    • 访问修饰符可以修饰实例变量;
    • 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
    • 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
    • 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。

    类变量(静态变量)

    • 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
    • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
    • 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
    • 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
    • 静态变量在第一次被访问时创建,在程序结束时销毁。
    • 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
    • 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
    • 静态变量可以通过:ClassName.VariableName的方式访问。
    • 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。

    static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

    1. static修饰成员方法

    static修饰的方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。

    但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。

    2. static修饰成员变量

    static修饰的变量也称为静态变量,静态变量和非静态变量的区别是:静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

    static成员变量的初始化顺序按照定义的顺序进行初始化。

    3. static修饰代码块

    static关键字还有一个比较重要的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。

    static块可以优化程序性能,是因为它的特性:只会在类被初次加载的时候执行一次。

    final修饰符


    对于final修饰的成员变量而言,一旦有了初始值,就不能被重新赋值,如果既没有在定义成员变量时指定初始值,也没有在初始化块、构造器中为成员变量指定初始值,那么这些成员变量的值将一直是系统默认分配的0、'\u0000'、false或null,这些成员变量也就完全失去了存在的意义。因此Java语法规定:final修饰的成员变量必须由程序员显式地指定初始值。

    归纳起来,final修饰的类变量、实例变量能指定初始值的地方如下:

    ➢ 类变量:必须在静态初始化块中指定初始值或声明该类变量时指定初始值,而且只能在两个地方的其中之一指定。

    ➢ 实例变量:必须在非静态初始化块、声明该实例变量或构造器中指定初始值,而且只能在三个地方的其中之一指定。

    系统不会对局部变量进行初始化,局部变量必须由程序员显式初始化。

    因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。

    如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能一次,不能重复赋值;

    如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。

    final修饰的形参因为形参在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰的形参不能被赋值。

    当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。

    但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

    对一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足三个条件,这个final变量就不再是一个变量,而是相当于一个直接量。

    ➢ 使用final修饰符修饰。➢ 在定义该final变量时指定了初始值。➢ 该初始值可以在编译时就被确定下来。

    注意:final修饰符的一个重要用途就是定义“宏变量”。

    当定义final变量时就为该变量指定了初始值,而且该初始值可以在编译时就确定下来,那么这个final变量本质上就是一个“宏变量”,编译器会把程序中所有用到该变量的地方直接替换成该变量的值。

    final修饰的方法不可被重写。

    final修饰的类不可以有子类,例如java.lang.Math类就是一个final类,它不可以有子类。

    不可变(immutable)类的意思是创建该类的实例后,该实例的实例变量是不可改变的。

    Java提供的8个包装类和java.lang.String类都是不可变类,当创建它们的实例后,其实例的实例变量不可改变。

    如果需要创建自定义的不可变类,可遵守如下规则。

    ➢ 使用private和final修饰符来修饰该类的成员变量。

    ➢ 提供带参数的构造器(或返回该实例的类方法),用于根据传入参数来初始化类里的成员变量。

    ➢ 仅为该类成员变量提供getter方法,不要为该类的成员变量提供setter方法,因为普通方法无法修改final修饰的成员变量。

    ➢ 如果有必要,重写Object类的hashCode()和equals()方法(关于重写hashCode()的步骤可参考8.3.1节)。equals()方法根据关键成员变量来作为两个对象是否相等的标准,除此之外,还应该保证两个用equals()方法判断为相等的对象的hashCode()也相等。

    static和final一块用表示什么?

    static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!

         

    对于变量,表示一旦给值就不可修改,并且通过类名可以访问。

    对于方法,表示不可覆盖,并且可以通过类名直接访问。       

  • 相关阅读:
    python 的 类属性 与 实例属性
    python 的 append 和 extend
    机器学习的最佳入门学习资源
    各种排序算法探讨与实现
    C++基础:C++中vector使用简介
    C++基础:C++中的explicit关键字
    差分约束(poj 1201
    codeforeces 547C
    2015 7月 做题记录
    set&map
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/15890029.html
Copyright © 2020-2023  润新知