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
方法不能声明为抽象方法 - 任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类最终。必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
- 有抽象方法的类一定要定义成抽象类,但抽象类可以不包含抽象方法。
- 构造方法,