在我们的生活中想要表达一个主题那么就会不可避免的多次提到同一个数据词(值)。java程序中也会出现这种情况,有些数据比较复杂或者是冗长,就不适合多次去写,因为可能会出错,所以java为了避免多次写同一个数据,使用变量或常量来命名(标识)我们在编写代码时可能多次使用的数据(值),并可以通过这些名字(标识符)来访问被命名(标识)的数据----即,使用变量或常量。那么对于我们编写代码的人来说,变量或常量该用在哪里,变量(常量)间的运算符怎么使用?跟随这篇文章,为你解惑。
1,变量顾名思义就是会改变的量--即它的值可以进行修改,如:赋一个新的值,进行计算,.......。
而常量就是一经定义赋值就不能进行修改,并且有一个final关键字的标识符进行修饰。
在前面我们提到了数据的类型有两种,基本数据类型和引用数据类型。接下来我们定义一个变量和常量,然后赋值看看能否在后期对它们进行修改,如下图。
变量可以分为成员变量和局部变量两种
对于成员变量和局部变量的区分可以先看定义的位置,然后成员变量间的区分再去看修饰符。
1)成员变量
定义在类体中
成员变量又可以分为静态变量和实例变量两种
①静态变量需要使用static关键字来修饰,它的有效区域为整个类----有效区域:程序代码可以访问变量的区域,如果超过了这个区域,编译就会出错。
②实例变量不用static来进行修饰,其有效范围也是整个类。
2)局部变量
局部变量定义在方法中,根据定义的位置可分:形参,方法体中的局部变量和代码块内的变量三种
【成员变量和局部变量除了定义的位置,修饰符不同外,还有一点不同,就是成员变量不需要显式的给一个初始化值,因为程序会自动产生一个无参的构造方法--后面会讲到,给成员变量赋值。而局部变量必须要有一个初始化值,不然程序就会报错,如下】
然后我们给局部变量赋一个初始化值,结果如下
在代码中的2种5个变量定义位置如下:
变量定义的位置决定了它的有效区域(作用域)
如果是定义在类中的变量作用域是整个类,而如果是定义在方法中或者是代码块中的变量其作用域则是所属的方法体或代码体
举例一种爆红情况:代码块中的变量写到了方法体中
将定义在方法体中的代码块局部变量(局部变量的作用域都挺小的)注释掉就不会报错了
所以变量不一定定义好后就能够用的,还是要注意它的作用域。下面对变量使用调用方法来进行赋值
2,定义变量最终都是要拿来赋值使用的,那么变量如何来赋值呢?在上面的图中我们已经知道了局部变量的赋值就是一经定义就要赋值,但对于成员变量来说,可以直接赋值(一般来说对于静态变量可以直接赋值,因为静态变量是所有对象可以共享的,它的值就是所有对象的值),也可以调用方法来进行赋值。我们一般用方法来进行赋值和调用
和变量一样,方法又可以分为成员方法和局部方法,区别同变量。成员方法又可分为静态方法和实例方法,两者的区别和变量里面的静态变量和实例变量类似。但是要注意的就是实例方法只能调用实例变量,因为我们的java在加载程序时是在加载类的同时加载类变量(类方法)的,然后才加载由类实例化后的对象------在java中的对象并不是我们现实生活中的‘对象’(喜欢的人),而是客观世界中存在的一切所有事物--如山,水,房屋等。而我们口头上的‘对象’是最狭隘的,如果要说的话,‘对象’属于java中的一个对象,因为‘对象’有属性,如身高,品质,年龄,名字等。java中有很多的对象,每一个对象都是一个独立的个体,对应的是不同的栈存储,他们的属性在堆内存中的存放位置也不同。构造一个对象时要通过new来构造。我们构造一个对象后就可以来对实例变量进行赋值等操作
在eclipse中,如果想要使用方法来对成员变量进行赋值,那么可以使用鼠标右击→source→Generate Getters and Setters。弹出来的界面如下,我们全选要赋值的属性(成员变量)
点击‘generate’之后的界面如下
下面对这些方法做一个简单的讲解:
public void setAge(int age) {
this.age = age;
}
上面的代码表示,生成的是一个给成员变量age赋值的成员方法-------方法的组成主要有访问修饰符,返回值类型,方法名,参数列表,方法体-----我们是给age赋值,就不需要有返回值,因此返回值的类型就写void,表示为空。然后参数列表里面写上我们要赋值的数据的类型及名字,然后在方法体里面定义一个变量来接收,this.age表示为当前对象的age---即哪个对象去调用,这个age就是哪个对象的age值。如下我们在main方法中创建一个对象并调用这个方法:
当然也可以再创建一个对象,然后再调用这个方法来进行属性的赋值【想要多少都可以自己创建】
public int getAge() {
return age;
}
上面的方法是用来取值的,就比方说我们赋值好了一个属性(成员方法),然后想要知道我们赋的值是什么,就可以用这个方法来获取。因为我们有需要返回的值,所以返回值的类型不为空,且其类型与要返回的值类型一致。参数列表为空即可。使用如下代码:
我们去调用一个实例方法时,必须使用对象去调用,如果使用类去调用,是不行的。为什么会报错呢?因为对象的加载在类之后,类加载到方法区里面之后,并不代表对象也加载到了堆内存中,去访问一个不存在的事物,是肯定行不通的,所以类访问不了对象。如下:
对于调用一个静态方法时,在java中虽然是不用计较到底是用类还是对象来调用(这些调用都不会报错),但是一般来说我们都是习惯性的用类来调用静态方法的,不怎么推荐使用对象来调用静态方法。是不是会有这么一个疑问,既然不推荐,那为什么java还支持呢?原因主要是为了java语法的完整性。我们上面提到java的类加载在对象的前面,所以用对象来调用类时是可以的---即可以在方法区的静态区域里面找到这么一个类存在。如下代码展示调用静态方法:
接下面我们提取其中的静态方法来做简单的介绍。
public static void setSchoolname(String schoolname) {
Student.schoolname = schoolname;
}
从上面的代码中我们可以看到:
1,系统给静态变量自动生成的方法是个加了static关键字的静态方法,为什么会这样子呢?那是因为在静态方法中不能引入非静态的变量(实例变量),我们将schoolname定义为静态变量,所以只能使用静态方法来调用。【实例方法中也不能引入静态的变量。两个变量之间用自己相对应的方法,如:静态变量用静态方法,实例变量用实例方法】
2,它里面调用变量的是类,而不是对象。为什么呢?因为上面讲过,静态方法内不能引入非静态的变量,所以就使用了类。像之前的实例方法中的this都是指当前调用它的对象,是个实例。
在这里提两嘴,类的组成有三个部分:成员变量,成员方法,构造方法。
上面我们已经了解了成员变量和成员方法,那么构造方法又是什么呢?
经过上面代码的实例,我们可以看到,在定义声明好一个变量后,给它们赋值还需要调用相关的方法,这样子就有点麻烦了:就打个比方,你要创建6个对象,每个对象有1到3个属性,那么我们就需要创建6~18个方法,那会显得代码冗杂。而且我们创建对象时是不能给对象的属性直接赋值的,就显得很抽象,我们看不到,得去调用方法或者是使用【对象名.属性名=属性值】进行赋值。而构造方法就很好的解决了这些问题。
首先,我们要知道,构造方法的三大特点:①方法名与类名一致②访问级别为public(公有的)③没有返回值类型--没有void。如下格式
public Student(String name,int age,String schoolname) {
this.age=age;
this.name=name;
this.schoolname=schoolname;
}
在程序代码中它会自动的生成一个无参构造方法,如果我们写了如上的带参构造方法后,那么系统将不会去调用无参构造方法,也就是说,我们之前的对象所调用的无参构造方法不存在了,就会报错,如下:
所以为了方便起见,我们可以手动去显式的写出来无参构造方法,如下,就不会有爆红了:
现在,我们已经知道构造方法的写法了,接下来就让我们来使用它吧,如下代码所示:
从上面的图片我们可以看到:打印出来的并不是stu3设置的值,而是我们之前stu1赋的值,相信大家心里面已经有答案了。正如前面所说schoolname为静态变量,是被所有类的实例对象共享的。静态变量是和最开始赋的值一样的,如果我们想要stu3打印出来‘温州理工学院’,那么可以修改stu1的schoolname的值,如下所示
至此,变量和方法都讲述完成,有疑问评论区回复。
public class Variable001 {
public static void main(String[] args) {
Student stu1=new Student();
Student stu2=new Student();
Student stu3=new Student("张三",19,"温州理工学院");
stu1.setAge(18);
stu2.setAge(20);
stu1.setSchoolname("温州理工学院");
stu3.printInfo();
System.out.println(stu1.age);
System.out.println(stu2.age);
System.out.println(stu1.getAge());
System.out.println(stu1.schoolname);
}
}
class Student{
String name;
int age;
static String schoolname;
public Student(String name,int age,String schoolname) {
this.age=age;
this.name=name;
this.schoolname=schoolname;
}
public void printInfo() {
System.out.printf("学生的名字是:%sn入学年龄是:%dn被录取的院校是:%sn",this.name,this.age,Student.schoolname);
}
public Student() {
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public static String getSchoolname() {
return schoolname;
}
public static void setSchoolname(String schoolname) {
Student.schoolname = schoolname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
{
int jubu;
}
}
}



