为何要有面向对象编程,由于万物皆是对象。java
对象是咱们描述/建模现实世界的最佳工具。编程
面向对象是一种思想,将功能封装进对象,强调具有了功能的对象。函数
举个例子:小汽车是一个对象没问题吧,这个对象有底盘,轮胎,车身,中控等属性。
除此以外,这个对象还具有一些动做,如前进,后退,转弯。工具
你看,用面向对象来描述世间万物是否是特别地流畅易懂。this
说到面向对象,要澄清两个概念,一个是“类”,一个是“实例”。code
类是具备相同特性和行为的对象集合,是一个抽象定义。对象
好比人类就是一个类,而实例是以类为模板,生成有意义的实体。作用域
好比你,我,他都是人类的一个实例,这么类比应该好理解了吧。字符串
先记住类的定义怎么写,参考下面伪代码:面向对象编程
class 类名{ 数据类型 属性 ; …. public 返回值的数据类型 方法名称(参数1,参数2…){ 程序语句 ; [return 表达式;] } }
类名告诉计算机,咱们对某一类事物进行了抽象,把共同的属性和行为提取出来,请看图:
第一只小黄猫,第二只小奶猫没问题吧。如今咱们把它们都抽象成猫类,都有四肢,尾巴,能跑能吃。
此后,咱们就有了猫类这个概念。若是还不能理解,请给我留言。
在src目录右键,New -> Java Class
输入Cat做为类名
/** Cat.java 文件 * 类名,Cat * 这个类里什么都没定义 */ public class Cat { }
以上代码即定义了一个类,类名叫Cat
前面提到的黄猫,奶猫都是猫类的实例。实例不是一个抽象概念,而是一个具体的物体。
在src目录右键,New -> Java Class
输入SeventhLessonOO
public class SeventhLessonOO { public static void main(String[] args) { /** * 新建一个实例,该变量的名字叫milkCat */ Cat milkCat = new Cat(); } }
Cat.java 和 SeventhLessonOO.java 都在src目录下
以上代码即实例化了一只奶猫。
Java根据构造函数来生成实例。
为了举例说明构造函数怎么使用,修改Cat.java以下
public class Cat { private String name; /* (1) 为了说明构造函数,咱们修改Cat的定义,加入name成员变量 */ /** * 这就是构造函数,这个函数没有返回值,也不须要在public后面写void * 记住这个语法规则 */ public Cat(String name) { this.name = name; /* this关键字表示当前实例自己 */ /* * 上面这句话的意思时,函数参数name的值,赋值给实例自己的name,即(1)处定义的private String name; */ } }
如何调用构造函数
public class SeventhLessonOO { public static void main(String[] args) { /** * 新建一个实例,该变量的名字叫milkCat * 因为咱们声明了构造函数,则必须使用构造函数 * 传入一个字符串参数 * "I m milkCat 会传递给参数name */ Cat milkCat = new Cat("I m milkCat"); } }
以上就是调用构造函数的过程,若是还写new Cat();会报错。
由于咱们已经声明了构造函数,那么就要按构造函数的定义来生成实例。
咱们说过,猫这个类,有四肢,有尾巴。如今咱们再次修改类的定义
加入body成员变量
public class Cat { private String name; /* (1) 为了说明构造函数,咱们修改Cat的定义,加入name成员变量 */ private String body; /* 新加了body成员变量 */ /** * 这就是构造函数,这个函数没有返回值,也不须要在public后面写void * 记住这个语法规则 * * 新加了body参数 */ public Cat(String name, String body) { this.name = name; /* this关键字表示当前实例自己 */ /* * 上面这句话的意思时,函数参数name的值,赋值给实例自己的name,即(1)处定义的private String name; */ this.body = body; } }
成员函数能够类比成这个类能够有什么动做。猫能够叫,能够跑
为了更好地直观感觉成员函数,咱们修改Cat这个类,让Cat这个类能够画一只猫
修改Cat.java
public class Cat { private String name; /* (1) 为了说明构造函数,咱们修改Cat的定义,加入name成员变量 */ private String body; /* 新加了body成员变量 */ /** * 这就是构造函数,这个函数没有返回值,也不须要在public后面写void * 记住这个语法规则 * * 新加了body参数 */ public Cat(String name, String body) { this.name = name; /* this关键字表示当前实例自己 */ /* * 上面这句话的意思时,函数参数name的值,赋值给实例自己的name,即(1)处定义的private String name; */ this.body = body; } /** * 定义一个成员函数 * 经过System打印地方式输出猫的字符样子 */ public void drawMyself() { System.out.println("Ooooo I am " + this.name); System.out.println(body); } }
修改main函数
public class SeventhLessonOO { public static void main(String[] args) { /** * 新建一个实例,该变量的名字叫milkCat * 因为咱们声明了构造函数,则必须使用构造函数 * 传入一个字符串参数 * "I m milkCat 会传递给参数name */ String body = " A_A" + "\n" + " (-.-)" + "\n" + " |-|" + "\n" + " / \\" + "\n" + "| | __" + "\n" + "| || | | \\___" + "\n" + "\\_||_/_/\n"; Cat milkCat = new Cat("I m milkCat", body); /** * 这句话让实例自己,调用成员函数,即 * 小奶猫把本身"画"出来 */ milkCat.drawMyself(); } }
程序输出:
Ooooo I am I m milkCat A_A (-.-) |-| / \ | | __ | || | | \___ \_||_/_/
是否是有点意思