类的成员
在搞明白类和对象之间的关系之后,接下来我们研究一下类中的成员。首先我们要知道什么是类的成员,只要定义在类下面的直接定义的元素都可以看作是类的成员
# 类成员 - 成员变量
成员变量也有人称为全局变量,我只要知道这仅仅是在称呼上的差异。Java 中不存在跨越多个类的那种全局变量定义
看一段代码
public class User{
String uname;
public static void main(String args[]){
int num=0;
}
}
2
3
4
5
6
7
8
9
代码解析
uname 直接定义的位置是类下面,这个位置也称为类的成员位置。这里的定义的变量作用范围是整个类
num 是定义在 main 方法中的变量,它的作用范围是整个 main 方法,同时这样的变量相对于全局变量的作用范围小,所以也称为局部变量
关于初始值的问题,首先要解释一个名词
初始化:某一物品最开始时具备的状态就时初始状态,初始化就是将该已经被改变了的状态恢复到最初的状态。
成员变量:在声明时(定义变量时)如果没有指定初始值,则由 (JVM) 根据其类型自动完成赋值(数值类型为 0,布尔类型为假)
局部变量:在声明时必须指定初始值
在最初学习编程时我一直认为初始化就是将变量的值赋值为 0,这种想法是错误的。如果变量在初次定义时赋值为 10,那么它的初始值就是 10
再看一段代码
public class Demo{
int age;
public static void main(String args){
double salary=100;
int workAge;
workAge=10;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
代码解析
age 作为成员变量可以由系统 (JVM) 自动完成赋值
salary 是局部变量只能自己赋值
workAge 也是局部变量,但是并没有在声明时赋值,这在 Java 中是允许的。但是必须是在使用这个变量时的操作是个赋值操作
# 类成员 - 构造方法
我们知道如果将一个类进行了实例化,那么得到的就是该类的对象。而构造方法的一个主要作用就是创建类的对象(虽然这样说其实不太准确)
定义格式
public class 类名{
访问权限修饰符 类名 (){
}
}
2
3
4
5
6
7
在上面的代码中我们大致可以看出构造方法的定义要求
定义在类的成员位置
方法名和类名相同
没有返回值类型的定义(因为构造方法的返回值只能是本类或者其子类的类型)
通常情况下我们在构造方法中完成对类其他成员的初始化
# 重载
重载只是一种概念,当然它也不是特指构造方法。只是构造方法的重载特征比较明显
重载的要求很简单:方法名相同参数列表不同
示例代码
public class User{
public User(){
}
public User(String uname){
// 一般情况下带有参数的构造方法都是为了给类的成员变量进行初始化
}
public User(int age){
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 关于空参构造
空参构造就是没有参数的构造方法,这也是初学者最容易忽略的一种构造方法。
当一个类中我们没有显式的声明(定义)时,系统 (JVM) 将给出一个默认的无参数构造方法,但是当我们声明(定义)了之后系统 (JVM) 将不再自动给出
我们看一段代码
public User{
public User(String uname){
}
}
public Student{
}
2
3
4
5
6
7
8
9
代码解析
User 类中仅有一个构造方法,就是我们自己定义的。
Student 类中也有一个构造方法,这个构造方法是系统 (JVM) 给出的
# 类成员的调用
在 Java 中虽然没有指针的概念,但是它一样需要理解内存。关于成员变量和成员方法的调用可以看下面的图
成员变量的使用过程
成员方法的使用过程
多个对象指向相同的内存
当多个对象的引用指向同一个内存(变量所记录的地址值是一样的)
只要任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据
# 小结
到这里类的成员基本介绍完了,其实还有内部类也可以算做类的成员。只是这个牵扯到其他的内容暂时先放一放