面向对象编程又叫做面向对象的程序设计(Object Oriented Programming,即OOP)是一种计算机编程架构。面向对象编程,以对象为核心,将现实中的实体抽象为需要解决的问题中的对象,需要根据所需用的对象在Java中设计对应的类,Java中所有的代码都是以类的形式存在。
一.类与对象
1.1类与对象的概念
1.1.1类与对象
类指具有相同属性和方法的一组对象的集合。类指的是某一类事物的统称;类中的某一个特定的物叫做对象。例如,学生李华,学生就是类,而李华则是学生类中的一个特定的个体,因此李华就是对象。
1.1.2定义类的方法
在Java中new一个新的class,在定义class时系统提示输入的name即类名,在创建好一个Student类之后Java中会自动生成如下代码:这时就完成了一个类的创建。
public class Student {
}
1.2类的组成
类由两个部分组成,分别是属性和方法。
1.2.1属性
属性,用来描述类中对象的特征。例如学生类,作为学生它可能具有的特征(属性)是姓名、学分、学号...
那么,如何定义属性呢?格式是:访问修饰符(public) 数据类型 属性名;如下所示:定义学生类的名字、学分属性。
public class Student {
//定义属性的格式:访问修饰符(public) 数据类型 属性名;
//定义学生的名字,学分属性
public String name;//名字属性
public int score;//学分属性
}
当然,访问修饰符不止public一种。public是指公有属性,表示该属性是公开的;注意一个Java中文件中可以定义多个类,但是被public修饰的类只能有一个。
访问修饰符还有private,表示私有的;该属性只能在自己的类中使用;default,是Java默认修饰符,当没有写访问修饰符时,会默认修饰符为default;protected,表示受保护的。
1.2.2方法
方法,用来描述对象可以展开的行为。例如,李华(对象)可以通过学习(学习,为方法)增加学分(学分,为属性)。
如何定义方法呢?格式是:public 返回值类型(void就是没有返回值,表示空) 方法名(参数类型 参数名,,,){方法体...}一个方法中可以有多个参数,也可以没有参数。
public class Student {
public String name;
public int score;
//方法(函数):行为
//格式:public 返回值类型 方法名(参数类型 参数名,,){ 方法体...}
//定义学生的学习方法
public void study(int sco) {
//让学生的学分累加
score += sco; // score += sco 等价于 score = score + sco
//输出语句 ln表示换行
System.out.println(name+"正在学习,学分增加了"+sco+"分,现在学分是"+score);
}
1.3如何调用类中的属性和方法
调用类的属性和方法需要通过对象在主函数中来调用。因此调用类的属性和方法的第一步是在主函数中创建对象,然后通过对象调用属性和方法。
//主函数
public static void main(String[] args) {
//在主函数中,类里面的属性和方法必须通过对象调用
//创建Student类的对象 格式:类名 对象名 = new 类名();
Student lh = new Student();
//调用属性:对象名.属性名 = 值;
lh.name = "李华";
lh.score = 80;
//调用方法:对象名.方法名(参数,,);
lh.study(5);
}
创建类的对象的格式:类名 对象名 = new 类名();
对象调用属性的格式:对象名.属性名 = 值;
对象调用方法的格式:对象名.方法名(参数,,);
二.构造方法
2.1构造方法的基本知识
2.1.1构造方法的概念及作用
类中的方法分为一般方法与构造方法,其中一般方法就是笔者在上文提到的类的方法。那么什么是构造方法呢?构造方法是有两点,分别是创建对象与初始化属性。在Java中,任何变量在被使用前都必须先设置初值,如果没有赋值,则会为其进行隐性赋值。Java提供了为类的属性赋初值的专门方法——构造方法。
public static void main(String[] args) {
//创建对象 格式:类名 对象名 = new 构造方法;
Student st = new Student();
}
我们发现在前面创建对象的时候,其实我们已经用到了构造方法,可以体现构造方法创建对象与初始化属性的作用。
2.1.2构造方法的特点
构造方法没有返回值类型,这里不是要写成void,而是直接不写。
构造方法的方法名必须是类名。
每个类都有一个默认的无参构造方法,当自己定义构造方法,那么默认的无参构造方法就会被替代。
构造方法可以有多个。
2.1.3如何定义构造方法
定义构造方法的格式: public 类名(参数类型 参数名,,){ 方法体...}
构造方法的示例:
public class Student {
//属性
private String name;
private int score;
//一般方法的格式:public 返回值类型 方法名(参数类型 参数名,,){ 方法体...}
//构造方法的格式:public 类名(参数类型 参数名,,){ 方法体...}
//构造方法中1.没有返回值类型 2.方法名必须类名
//默认的无参构造方法
public Student() {
}
//每个类都有一个默认的无参构造方法,当自己定义构造方法,那么默认的无参构造方法就会被替代
//自定义的构造方法
//构造方法的方法重载
public Student(String name,int score) {
this.name = name;
this.score = score;
}
}
在一个类中,有多个方法名重名,但参数的类型、个数或顺序不一样时,这类方法就叫方法重载。我们可以发现上面给出的实例代码中两个构造方法,方法名相同,但是参数类型、个数不同,这就是方法重载,构造方法是支持方法重载的。
2.2构造方法与set函数
public class Student {
//构造方法,初始化属性
public Student(String name) {
this.name = name;
}
//定义set方法,初始化属性
public void setName(String name) {
this.name = name;
}
}
我们发现在上面这两段代码中,构造方法与set方法都起到了初始化属性的作用,即这两种方法都能给name赋值,那么这两种方法有什么区别呢?
①调用的时间不同
构造方法是创建对象时自动调用的;set方法是对象创建完成之后手动调用的。
②调用的主体
构造方法是自动调用的;set方法是通过对象名手动调用的。
③调用次数
构造方法在对象的初始化时只能自动调用一次;set方法可以调用多次。
2.3构造方法的相互调用
2.3.1this的使用
this表示本类对象“我”,例如在下面这个代码中,如何区分set函数中所给出的两个name谁是属性、谁是参数呢;无法确定。因此会自动识别两个name都是参数,那这个方法就是无意义的。
private String name;
public void setName(String name) {
name = name;
}
这时我们就会用到this来帮助区分;当我们利用this把这段代码修改成如下格式时:
private String name;
public void setName(String name) {
this.name = name;
}
这时,代码中的this.name就中的name就代表了对象的属性name;而等号右边的name则表示的是这个方法中的参数。
2.3.2构造方法的相互调用
通过this来实现了构造方法的相互调用,如下所示的实例代码中,利用this在第二个构造方法中调用第一个构造方法给name、score属性初始化。相互调用的格式,this(参数,,,);this构造方法的相互调用,这句代码必须写在方法的第一句。要注意它调用的那个构造方法里的参数,在this这个代码中需要全部写出来。如下文this(“张三”,60);如果只写this(60)就会报错(在只有这两个构造方法的前提下)。
public Student(String name,int score) {
this.name = name;
this.score = score;
}
public Student() {
//构造方法相互调用:this(参数,,);
//这句代码必须写在方法的第一句
this("张三",60);
}