一、类与对象
【对象的含义】
以前学过C++,大致懂得一个名字叫做面向对象,面向对象是把构成问题的事物分解成多个对象,而建立对象的目的不是为了完成一个步骤,而是为了描述这个事物在整个问题解决过程中的状态和行为。面向对象中体现的是产生行为的各个对象之间的相互关系。
上面说的好绕,通俗一点的解释:
对象:现实中的具体的事物具体的物体都可以称作是对象。比如:某一张书桌、某一台电脑、某一个人
(P.S 一定要具体到是某一件东西,一件!不能说书桌、电脑是一个对象,“书桌”、“电脑”是用另一个词来表示的,待会会说到)
在Java中(其实在生活中也是如此),描述对象从两个方面入手,一是特征,二是功能/行为(这里是因为如果是物品那肯定就是功能,如果是人或者动物之类的那就是行为了)
【类的含义】
我们在生活中常常说分类分类,我们会理解成就是把具有相同特征的(或者相似行为/功能)放到一起,比如:苹果、梨、香蕉、火龙果我们将其归为水果类,电视、冰箱、洗衣机我们将其归为家用电器类。是抽象的!
在Java中也是如此,上面提到了对象从特征和功能/行为两个方面进行描述,那么程序中的类就是根据生活中对象的特征和功能/行为,按照程序中类的固定格式进行的抽象定义。
类是由两个部分组成:属性 + 方法
属性对应对象的特征,方法对应对象的行为/功能
其中方法包括了4种,1.普通方法 2.构造方法 3.静态方法 4.最终方法
今天会提到普通方法和构造方法两种方法,后两种方法之后再说。
构造方法:方法名与类名完全一致,无返回值类型。是用来实例化一个对象的,会将类中的属性和方法写入到堆内存中,之后返回堆内存的首地址给对象名。
一个类中,如果没有定义构造方法,会默认隐式的声明一个无参数的构造方法。在创建对象的时候new后面的调用的就是构造方法。
Student stu = new Student()
这边调用的是构造方法
其实一开始我也不太理解构造方法的意思,后来大概理解的意思就是,这是每一个类都会默认有的一个方法,只有利用这个方法才可以去初始化(通俗点说叫创建)一个类中的对象。
构造方法也不一定要用默认产生的,也可以进行重载。(重载的内容下面会介绍)
普通方法:类似我们之前在C++中学的函数,如果不理解的话,也可以先理解为描述对象的行为。
【如何定义类】
类的定义形式:
public class 类名 {
访问修饰符(public、private...) 数据类型 属性名;
//构造方法
访问修饰符 构造方法名(数据类型 参数名,...){
}
//普通方法
访问修饰符 返回值类型 方法名(数据类型 参数名,...){
}
}
举个例子,对于所有的学生,可以如下描述:
所有的学生都有姓名与学分,所有的学生都有学习和刷微博的行为
那么可以写成一个学生类,属性是姓名与学分,行为是学习与刷微博
public class student {
//学生的姓名属性
private String name;
//学生的学分属性
private int score;
/*普通方法:设置学生姓名的方法
* 因为姓名的访问修饰符是private,所以要带有get、set的普通方法进行设置
* n为要设置的姓名
*/
public void setName(String n){
name = n;
}
/*普通方法:设置学生学习的方法
*
* 经过学习,学分加一
* 输出某人正在学习中
*/
public void study(){
score++;
System.out.println(name+"正在学习中");
}
/*普通方法:设置学生刷微博的方法
* 沉迷微博,学分减一
* 输出某人正在刷微博
*/
public void play(){
score--;
System.out.println(name+"沉迷刷微博不可自拔");
}
}
之后的设置姓名、学习、刷微博都是普通方法,定义的时候只需要注意格式和其中的算法即可。
【类的作用】
我们写好了Student类,可以通过这个类创建具体的对象来对所有的学生进行管理,因此,现在要做的是创建对象,对象创建之后就可以调用每一个对象具有的属性和方法。
我们定义一个Manager管理员类:
public class Manager {
/**
* 这是入口主函数
*/
public static void main(String[] args) {
//创建一个学生对象(这是在利用构造方法实例化对象)
student stu = new student();
//调用对象的设置姓名的方法
stu.setName("小明");
//调用对象的学习的方法
stu.study();
//创建另一个学生对象
student stu1 = new student();
//调用对象的设置姓名的方法
stu1.setName("大明");
//调用对象的刷微博的方法
stu1.play();
}
}
代码执行的结果如图所示:
P.S 因为自己是有一点点C++基础的,基本的语法能够理解,所以就没有过多的说明,如果有小伙伴愿意学习我真的很乐意和你一起进步呀~比心~
【类与对象的关系】
二、方法重载
下面说今天的第二个大问题,也是上面提到的
【方法重载】
方法的重载,是指在一个类中可以定义多个方法名相同,但是参数个数、类型和顺序不同的方法。
重载的好处是,我们在调用的时候可以根据实际的情况进行灵活的选择。
重载的条件:①必须是在同类中或者是有继承关系的类中;
②方法名必须完全一致;
③方法所带的参数个数、类型、顺序必须不一致。
1.构造方法的重载
为什么会进行构造方法的重载呢,我们知道,构造方法是用来创建对象的,这个对象是好比一个新生儿,不同的新生儿出生之前有的是取好了名字的有的是没有取名字的,这样两个方法的内容就是不一样的,比如在学生类中可以有这样两个构造方法。
public student(){{
}
public student(string n){
name = n;
}
或者其他在构造的时候需要初始化的参数值是不同的。
要注意的时候,如果重载了构造方法,那么默认的构造方法就失效了,如果还需要使用的话要进行显示的声明(也就是要写出来,不能认为会默认产生)。
2.普通方法的重载
普通方法的重载其实就是定义方法名相同而参数不同的方法,比如在学生类中的学习方法,可以有多种学习方法,比如有的学习方法是学分加一,有的学习方法是获得了某项技能,这样写在方法体里面的内容是不一样的。
换句话说,是相同的方法名,但是传入的数据不同以及方法的内容不同,就叫做普通方法的重载
只要写的每一个方法的参数的类型数目不一样就可以。在调用的时候,会根据传入的参数和哪个方法定义时的参数相配套就调用哪一个方法。
【this关键字】
之前在学C++的时候就学过一个叫做this指针的,不过到现在我已经想不起来他的具体作用了,这次在Java中又遇到,想要好好了解一下。
举个例子来说明:
比如上述的student类中有一个普通方法 setName,用来设置学生姓名。
这里传入的参数设为了n,n就是要设置的姓名,那么这里我是否用name作为传入的参数呢?
试一试敲进去,发现没有提示我错误。
编译看看
这个结果说明,我并没有把name这个参数传入,这是为什么呢?
事实上,Java是有一个就近原则的,在上面的代码中,我们会认为左边的name代表的是属性,右边的name代表的是参数,但是,计算机没有我们这么聪明噢~它会很笨的认为,name这个单词靠近括号里面的(String name),就把两个name都当做是参数看待了,所以会导致结果并没有给这个学生赋上名字。
那在传参时就不能使用与属性相同的名字吗?
可以的!this关键字可以帮助我们。
我们来实验看看。
说明是可行的!为什么在name前面加上一个this关键字就把这个name变成了属性呢?
因为this在类中就是在用来指代当前对象的,就像我们都自称“我”一样,具体到哪个对象,这个this指的就是谁。
这是this的第一个作用,也就是在不能区分参数和属性时,利用this关键字进行区分。
另外,this还可调用方法
1.可以用来调用构造方法:
两个方法都设置一个输出内容,用来查看调用情况。
可以这么理解,this("unknown")是在调用下面的带有参数的构造函数,括号里面内容就是作为参数传入有参数构造函数的,因此当我将对对象的设置姓名的这一行代码注释掉以后,输出的结果就变成了名字是unknown。
2.用来调用普通方法
格式是 this.普通方法名(参数值,,,)
我实验了一下,想说用this来调用学习这个普通函数,可是这里报错,还存在疑问!等我得到解释了再回来修改咯!
总结一下:①可以用来区分属性与参数;②可以用来调用方法。
this表示当前调用方法的对象,就类似与我们在生活中说的“我”这个词。