类与对象
类的概念我们平时已经听过很多了。人类、鸟类、鱼类... 所谓类,就是对一类事物的描述,是抽象的、概念上的定义,比如鸟类,就泛指所有具有鸟类特征的动物。比如人类,不同的人,有着不同的性格、不同的爱好、不同的样貌等等,但是他们根本上都是人,所以说可以将他们抽象描述为人类。简单来说,类是对一类事物的统称,而对象则是类的一个个例。例如,学生是一个类,而学生小明则是一个对象,属于学生类的一个实例。
创建一个实例对象
实际上整个流程为
对象的使用
我们可以使用一个变量来指代某个对象,只不过引用类型的变量,存储的是对象的引用,而不是对象本身。
例如,这里将变量p的值赋值给变量p1实际上传递的是对象的引用,而不是对象本身,p1和p指向的都是同一个对象
看一下运行结果,可以看出运行结果是true,证明p和p1的值是相等的,即它们的指向是一样的。
但如果这样去编写,分别创建一个对象的话,它们的引用类型的变量就不一样了,也就是它们的指向不一样了
看一下运行结果
现在我们有了对象的引用之后,我们就可以进行操作了,可以直接访问对象的一些属性,也就是我们在类中定义好的那些,对于不同的对象,这些属性都具体存放值也会不同。例如,可以修改对象的名字
看一下运行结果
不过值得注意的是,不同对象的属性是分开独立存放的,每个对象都有一个自己的空间,修改一个对象的属性并不会影响到其他对象
看一下运行结果
注意,如果不引用任何的对象,那肯定是不应该去通过这个变量去操作所引用的对象的,虽然这样可以编译通过,但是在运行时会出现问题
看一下运行结果,发现发生了空指针异常
对象创建成功之后,它的属性没有进行赋值,那么创建对象之后能否直接访问呢?
看一下运行结果,
方法创建与使用
在一个类当中,成员变量可以说是静态属性,而方法可以说是动态属性,方法同时也可以用来表示对象的行为。方法是语句的集合,是为了完成某件事情而存在的。完成某件事情,可以有结果,也可以做了就做了,不返回结果。比如计算两个数字的和,我们需要得到计算后的结果,所以说方法需要有返回值;又比如,我们只想吧数字打印在控制台,只需要打印就行,不用给我结果,所以说方法不需要有返回值。
方法的定义如下:
注意,方法名称同样可以随便起,但是规则跟变量的命名差不多,也是尽量使用小写字母开头的单词,如果是多个单词,一般使用驼峰命名法最规范。
像这样执行定义好的方法,一般称之为方法的调用,看一下运行结果
比如现在要让人类学会加法运算,也可以通过定义一个方法的形式来完成,只不过,要完成加法运算,需要别人给人类提供两个参与加法运算的值才可以,所以这里就要用到参数了
同时可以测试一下
可以先测试一下,发现name依然是没有修改的状态,因为当出现重名的时候,默认情况下会优先使用作用域最近的变量
看一下运行结果,可以看到name的值确实发生了变化
方法重载
方法的重载是指方法名称相同但方法的参数不同,方法的参数不同即方法的参数不同或者方法的参数个数不同。不过值得注意的是方法的返回值可以相同也可以不同。例如:
在这个程序中,就使用到了方法的重载,看一下运行结果
构造方法
构造方法是一种比较特殊的方法,它的名称和类的名称一样,并且没有返回值。,默认情况下每个类都会自带一个没有任何参数的无参构造方法(只是不用我们去写,编译出来就自带),而且在创建对象的时候都会调用一次构造方法。当然,我们也可以手动声明构造方法,对其进行修改,例如:
看一下运行结果
当然,也可以为构造方法设定参数,例如
不过值得注意的是,,在定义一个构造方法之后,会覆盖掉默认的那一个无参构造方法,除非手动重载一个无参构造,否则要创建这个类的对象,必须调用定义的构造方法
要给成员变量设定初始值,不仅可以通过构造方法,也可以直接在定义时赋值。不过需要特别注意的是,成员变量的初始化在调用构造方法前就开始了
也可以在类中添加代码块,代码块同样会在对象构造之前进行,在成员变量初始化之后执行
静态变量和静态方法
可以看到,由于静态属性是属于类的,因此无论通过什么方式改变,都改变的是同一个目标
所以说一般情况下,我们并不会通过一个具体的对象去修改和使用静态属性,而是通过这个类去使用
和静态变量类似,静态方法也是属于类的,一般由类去调用