59-面向对象的理解
程序开发一开始是使用面向过程的开发模式,就好像C语言一样。那时候编程是从一个方法入口,然后一直往下执行,中间可以调用一些函数,当然也有if等流程语句。这种程序是结构性的开发。
但是随着时间流逝,面向过程的开发程序会变得越来越庞大,结构化的代码会使得难懂或者混乱。
然后有些人开始想另外一种开发思想,就是面向对象的开发思想。面向对象其实是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,然后这些对象具有它相应的属性以及它的行为。这样使用面向对象,我们可以对现实世界的对象进行建模。
比如以前面向过程如果想要实现一个求两个数的和的功能,我们可能要定义两个数然后再进行相加。如果后面又要进行求另外两个数的和,我们又要创建两个数再进行相加。现在有了面向对象,我们可以定义一个叫”加法器”的类,然后通过这个类型操作一个”FoxDevelop.com网校加法器”的对象,使用这个对象里面定义的”相加”的方法就可以实现相加了。
面向对象开发把很多东西的操作交给了对象来实现,不需要我们费力费心,这样可以把关注点分离,程序也就更好管理了,代码就清晰了。比如说我要去北京,我们就生成一辆车,然后这辆车就开着去北京。如果是面向过程,我们可能要生产轮子、生成发动机、购买汽油等等最后才能去北京。面向过程开发其实就是把复杂的操作细分到不同的对象里面去。
什么是类
类是同一类事物的统称。如果将现实世界中的一个事物抽象成对象,类就是这个对象的统称。比如人类、鸟类、动物类、飞机类、火车类、汽车类。类是构造对象的模型。通过汽车类可以生成出一台看得见摸得着的汽车,但是我们却没法看到一个叫汽车类的东西。
类的概念其实就是一类某某东西的统称,和我们平常理解的类其实是一样的,不要因为编程而忘记了原来的意义。类是封装对象的属性和行为的载体,类通常会有它的属性和行为:
- 属性是这一类东西的一些固有的特征
- 行为则是这一类东西的一些能力、功能等
比如汽车类,它的属性就是它有轮子、有发动机、有出厂日期、有发动机号码、有排量、有功率、有扭矩、有颜色等等。而它的行为能力则有会跑、会发电、会消耗汽油等等。
60-面向对象的特点
1. 封装
封装是面向对象编程的核心思想,将对象的属性和行为封装起来。把对象的行为和属性封装起来的载体就是类。类通常会隐藏它的细节的东西,外界不需要知道它内部的具体实现,这就是封装的思想。比如我们使用计算机,不需要关心计算机内部的实现,只需要按开机键启动计算机,然后点击键盘鼠标使用。
采用封装的思想,保证类内部数据结构的完整性,因为这样外界没法直接修改这些数据结构的。就好比CPU是一个封装,它只提交针脚一个接口和外界沟通,外界不能随便修改它里面的东西,这样可以保证它能完整处理,提供程序的健壮性、可维护性。
2. 继承
类和类之间是具有关系的。比如动物类和鸟类,鸟类是动物类的一个子类。动物类下面可能还有猫科动物类、犬科动物类、鱼类、人类等等。上面的这些关系叫继承关系。除了继承关系,还有一些是关联关系,比如汽车类和发动机类,如果把发动机也封装成一个类,那么汽车类就需要发动机类,发动机类和汽车类之间就是关联关系了。类和类之间还有很多关系。
3. 多态
上面说到父类和子类,其实父类对象引用子类的特征就是多态。也就是说后面编程的时候,可以让父类对象去执行子类里面的代码。
61-类的构造方法
在类中除了成员方法外,还存在一种特殊的方法,那就是构造方法。构造方法是一个和类同名的方法。我们在new对象创建对象的时候,类就会自动调用构造方法的。
构造方法的特点
- 没有返回值
- 构造方法名称和类名同名
普通方法如果没有返回值,返回类型要标上void。但是构造方法没有返回值,不要写void,就是什么都没有。
构造方法的格式
public Person() {
//构造方法的方法体
}Code language: PHP (php)
当我们没有给类写构造方法的时候,编译器会默认添加一个无参的构造函数。但是如果我们给类添加了构造方法的时候,编译器就不会再帮我们添加一个构造方法了。这个时候如果我们再new这个类的对象的时候,则会报错的。
this关键字
this关键字可以调用类的成员变量和成员方法。this还可以调用类中的其他构造方法。比如在一个无参数构造方法里面可以调用其他的带参构造方法:
this("小北");Code language: JavaScript (javascript)
示例代码
package cn.bamn;
public class Person {
private String name; //person类的属性
//如果我们的类里面没有写无参构造函数的时候 则默认编译器会帮我们创建一个无参的构造函数
public Person() {}
//如果我们程序员自己添加了一个带参构造函数的时候 那么编译器就不会帮我们添加无参的构造函数
public Person(String name) {
// TODO Auto-generated constructor stub
this.name = name;
}
//person类的行为 方法
public int Run() {
return 1;
}
}Code language: PHP (php)
62-类的主方法
主方法是类的入口点,它定义了程序从这里开始。实际上主方法是我们点击程序启动的时候操作系统调用主方法。
public static void main(String[] args) {
}Code language: JavaScript (javascript)
主方法的特征
- 主方法是静态的,如果主方法之间调用其他方法则也需要是静态的,否则则需要new对象才能调用
- 主方法没有返回值
- 主方法的形参是数组
形参是方法括号里面的参数,它是用来接收外面调用这个方法时传入的参数的。args是一个数组,我们可以输出这个数组的值。这些值可以在eclipse中设置,点击菜单的run / run configurations,然后在选项卡里面选择Arguments(参数)。
示例代码
package cn.bamn;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
public class Image {
public static void main(String[] args) {
String s = new String("xxx www.FoxDevelop.com");
Person p = new Person();
Person xiaoPan = new Person("小潘");
//int a = id;
float d = new Image().f;
Say();
for (String x : args) {
System.out.println(x);
}
}
//public static int id;
public float f = 12.3f;
public static void Say() {
}
}Code language: JavaScript (javascript)
63-成员变量
对象的属性称为成员变量。比如汽车的颜色、发动机型号等都算是成员变量。下面以书类为例子,Book类有编号int number、书名name、分类category,我们把它定义为私有的。提供两个方法去设置书的名字和读取书的名字。
示例代码
package cn.bamn;
class Book {
private String number;
private String name;
private String category;
private int year;
private float price;
public Book() {
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public class Test {
public static void main(String[] args) {
Book b = new Book();
b.setName("天龙八部");
System.out.println(b.getName());
}
}Code language: JavaScript (javascript)
64-成员方法
成员方法是对象中的行为。比如上面的getName和setName两个方法,它们是动作行为,用来获取书名和设置书名。
一个成员方法可以有参数,这个参数的类型可以是基本数据类型也可以是对象类型。如果方法需要返回值则需要使用return,一旦return后方法的执行就终止了。如果没有返回值可以使用void。
成员方法的返回值可以是变量、对象、常量、字面值,只要它的值的类型和方法的返回值的类型一致就可以。
示例代码
public void setName(String name) {
this.name = name;
}
public String getName() {
return getString();
//return this.name;
}
private String getString() {
return "xxxx";
}Code language: JavaScript (javascript)