「Java SE」变量类型和修饰符


Java的变量类型

Java中的变量类型有以下三种——

  • 类变量
  • 实例变量
  • 局部变量

类变量(静态变量)

  • 类变量是属于所在的类,而不属于任何由该类定义的对象。 换句话说,不管实例化了多少对象,类变量都只有一个。类变量是由static修饰的,这一点和C++相似。
  • 一般情况下和final一起声明常量,很少单独使用static声明变量。而且,大多数静态变量被声明为public类型。因此,经常会见到
    public static final CONST = 0x7fffffff //一般常量定义使用全大写命名
  • 默认值和实例化变量相似,数值型变量默认值是0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
  • 访问时使用ClassName.VariableName
  • 可以被访问修饰符public,private,protected,defualt修饰
  • 例程如下
    public class Counter{
        public static countValue = 0;
    
        public Counter(){
            countValue++;
        }
    
        public static void main(String[] args){
            for(int i = 0; i < 100; ++i){
                new Counter();
            }
            System.out.println("countValue = " + countValue); //输出 countValue = 100
        }
    }

实例变量

  • 与类变量不同,实例变量是属于实例化的对象,也就是说如果实例化100个对象,那就有100的实例变量的值被确定。
  • 实例变量对于类中的方法、构造方法或者语句块是可见的,而且实例变量的值应该至少被一个方法、构造方法或者语句块引用。
  • 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定。
  • 访问时使用ObjectName.VariableName
  • 可以被访问修饰符public,private,protected,defualt修饰。

局部变量

  • 局部变量必须要在局部变量声明在方法、构造方法或者语句块中,作用域是它所在的方法、构造方法或者语句块,并且只在作用域中可见。
  • 实例变量没有默认值,因此在声明后必须初始化。
  • 不可以被访问控制修饰符public,private,protected,defualt修饰。
  • 不可以被非访问访问修饰符static修饰。
  • 例程如下
    public class Adder{
    
        public add(int a, int b){
            int sum = a + b;
            return sum;
        }
    
        public static void main(String[] args){
            System.out.println(add(1, 2));
        }
    
    }

Java 访问控制修饰符

Java中的访问控制修饰符有以下4种——

  • public
  • protected
  • default
  • private
修饰符 当前类 同一包内 子孙类(同一个包) 子孙类(不同包) 其他包
public Y Y Y Y Y
protected Y Y Y Y/N N
default Y Y Y N N
private Y N N N N

public

  • 适用范围:类、接口、变量、方法,构造方法。
  • 访问权限:被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问(包括同一包和不同包)
  • 如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包再使用。
  • 类所有的public方法和变量都能被其子类继承。
  • main() 必须设置为共有。
  • 一个Java文件中可以定义多个类,但是最多只有一个类被public修饰,并且这个类的类名与文件名必须相同。

protected

  • 适用范围:变量、方法,构造方法。类(内部类除外)和接口不能声明为 protected
  • 访问权限protected 修饰的变量,方法,构造方法可以被同一包内的所有类访问(即defualt的访问权限),也可以被不同包内的子孙类部分访问,讨论如下——
    • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造方法能被同一个包中的任何其他类访问;
    • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的 protected 方法。
  • 子类能访问和重写 protected 修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量(这就是为什么叫做protected的原因)
  • 构造方法使用修饰符,则默认为protected;

default

  • 适用范围:类、接口、变量、方法,构造方法。
  • 访问权限:使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的

private

  • 适用范围:变量、方法,构造方法。类(内部类除外)和接口不能声明为 private
  • 访问权限:被声明为 private 的方法、变量和构造方法只能被所属类访问
  • 声明为private的变量只能通过类中public方法被外部类访问,因此可以实现类数据的保护和类实现细节多隐藏。

Java 中的非访问修饰符

Java中的非访问修饰符有以下6种——

  • static
  • final
  • abstract
  • synchronized
  • transient
  • volatile(后三种与多线程和序列化有关,不在此介绍)

static

  • 意为“静态的”,归属于类。
  • 适用范围:变量和方法
    • static变量:即静态变量。独立于对象,只归属于整个类。
      • static不可以修饰局部变量!!!
      • 访问时使用ClassName.variableName
    • static方法:即静态方法。独立于对象,只归属于整个类。
      • 静态方法不能使用所在类的非静态变量
      • 静态方法只能从参数列表中获取数据,然后计算这些数据。
      • 访问时使用ClassName.methodName

final

  • 意为“最终的”,一旦定义后,不能被重新定义
  • 适用范围:变量,方法和类
    • final变量:一旦赋值后,不能被重新赋值。
      • final修饰的实例变量必须显式指定初始值(因为它不能再次被赋值)
      • final修饰符通常和static修饰符一起使用来创建类常量(上文已经提到了)
    • final方法:可以被子类继承,但是不能被子类重写。
      • final修饰方法可以防止方法的内容被子类修改。
    • final类:final不能被继承,没有类能够继承final类的任何特性。

abstract

  • 意为“抽象的”,目的是为了将来可以对abstract的修饰目标进行扩充
  • 适用范围:方法和类
    • abstract类:抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
      • 有抽象方法的类一定要定义成抽象类,但抽象类可以不包含抽象方法。
      • 只有抽象类的非抽象子类可以创建对象
                
    • abstract方法:是一种没有任何实现的方法(抽象类中的抽象方法只是声明,不包含方法体),该方法的具体实现由子类提供。
      public class Student{
          public abstract getNum();
      }
      
      public class StudentNum extends Student{
          public abstract getNum(){
              //realize...
          };
      }
      • 构造方法static方法(类方法)final方法不能声明为抽象方法
      • 任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类最终。必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
      • 有抽象方法的类一定要定义成抽象类,但抽象类可以不包含抽象方法。

文章作者: Hyggge
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hyggge !
  目录