目录
4.1面向对象的基本概念
这里先介绍面向对象程序设计的一些关键概念,并开始使用类,你需要学习一些术语,我们尽量用比较浅显的语言来介绍,因为这些内容都比较重要,所以希望大家好好好理解。
一、什么是对象和面向对象的编程。
对象就是存在的具体实体,具有明确定义的状态和行为,是面向对象编程的核心,用来描述现实世界中的实体,为计算机应用程序提供实体基础,也是完成特定任务一个封装。这样描述对象却是有点罗嗦。因为与传统的C语言不通,C语言是过程语言,而java语言是面向对象的语言,所以对象是java语言的核心。
那到底什么是对象,能举个例子吗?其实在我们生活中,什么都可以抽象成为对象,比如你有一辆汽车,这辆车就是对象了,这个对象(汽车),它有颜色,牌子,有产地等等,这些我们也可以称为是它的属性,它也能开动,要维修等等这些操作,我们成为是它的行为。这就是对象了。
在面向对象编程中(简称:OOP),现实世界的所有事物全都被视为对象。OOP的目标是在计算机程序中,模拟现实世界中的概念,我们可以借助对象的描述就能够在计算机程序中用类似的实体模拟现实世界中的实体。同时OOP也是设计和实现软件系统的方法。
二、对象和类
类是具有相同属性和行为的一组对象的集合。类是用于组合各个对象所共有操作和属性的一种机制。
对象和类有什么关系呢!我们可以举个例子来回答一下。比如现在有一个收银员叫张小芳的。那么我们可以把他抽象成为一个对象——收银员对象。
这个对象有以下的一些资料:
姓名:张小芳
职衔:收银员
年龄:28
体重:60千克
操作:
收款
打印帐单
当然一个超市里面肯定不止一个收银员,可能收银员小明、小芳等等。这些都是收银员对象,或者称之为实例,而且所有的收银员都有姓名、职衔、年龄、体重等属性;收款和打印帐单等行为。我们通过对收银员对象进行抽象,就可以得到一个收银员类(class),这个类拥有姓名、职衔、年龄、体重等属性;收款和打印帐单等行为。
所以我们得出:类是对象的原型,所有属于同一个类的对象都具有相同的属性和行为,我们抽象了类之后,我们又可以用类定义实体。类是概念模型,对象是真实的模型。
三、属性和方法
类是java的基本单位,类一般包括属性和方法。
属性:事物的特性在类中表示为变量,每个对象的每个属性都拥有其特有的值,属性名称由类的所有实例共享,在类中表示对象或实体拥有的特性时称为属性,比如我们上面所说的收银员类就是有有姓名、职衔、年龄、体重等属性,属性一般使用名词描述。
方法:操作的实际实现方法指定操作对象数据的方式如何执行所请求的操作的规范在得到操作请求时指定如何做的算法对象执行的操作称为方法。比如我们上面所说的收银员类就是有收款和打印帐单等方法,属性一般使用动词描述。
四、面向对象思想
因为面向对象思想简单概括起来就是三个:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。
封装:就是把某些内容封起来,不让别人知道。有些对象自己的属性内部实现细节是不想让其他的对象知晓的,那么我们就可以把它封装起来。这就是封装的基本概念。
继承:顾名思义,继承就是儿子对父亲的继承,在类也可以有子类和父类的。子类对父类的继承,但是继承也不是全部继承的,若子类与父类在同一包中。子类继承了父类中所有不是private的成员方法(除构造方法)及不是private的成员变量继承,有关继承的具体我们在后面的会再介绍。继承的目标主要实现重用代码,节省开发时间。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向父类的指针,来调用实现子类中的方法。在java中多态一般又分为方法的重写和方法的重载。
编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。
一下让大家理解这些概念是不可能的,大家可以先简单理解和记忆一下,以后再慢慢消化。
4.2属性和普通方法
一、定义类
上一节讲了很多深奥的理论,那么这节我们就得实践一下,先简单描述一下我们的实体世界:有一个学生小明,那么这个学生就是一个对象,这个对象有哪些属性和方法呢,我们可以先简单抽象一下,属性有(姓名:小明,学号:001,性别:男,年龄:12,体重:23kg),还有就是方法(做作业,上课)等。我们通过对这个学生对象进行分析后就可以抽象一个学生类,下面就可以把现实的实体世界通过计算机的实体来描述了。打开Eclipse,我们可以新建一个Student类。
/** * 学生类 * * @author Administrator * */ public class Student { /** 属性 **/ // 姓名 String name; // 学号 int number; // 性别 boolean gender; // 年龄 int age; // 体重 double weight; /** 方法 **/ // 普通方法 // / // 访问修饰符 返回值类型 方法名称(参数1,参数2,...){ // 方法体 // } //返回类型为String public String goschool(String date) { return ""; } // 做作业 // void 表示返回空值 空 public void dohomework() { } }
在这个类里面我们定义了相关的属性和方法,属性的定义比较简单,和我们以前定义一个变量的格式是一样的。
属性类型 属性名称
方法的定义也不难,具体的格式是
访问修饰符 返回值类型 方法名称(参数1,参数2,...){
方法体
}
访问修饰符我们以后再讲,一个方法基本包括四个部分,返回值、方法名称、参数和方法体,除了参数可以没有之外其他都是必须的,但是就算没有参数,在方法名称后面也要有个小括号()。我们上面的例子使用void作为返回值类型,表示没有返回值,如果是其他的返回值类型,则必须在方法中使用return关键字返回相对于类型的值。
二、通过类构造对象
类的定义就搞定了,下面我们可以通过上面定义的类构造对象(或者叫实例)。格式是如下:
类名 对象名称=new 类名();
我们可以在新建一个Run类,在这个类里面就只有一个main方法,以前我们也介绍过了,main方法是程序的入口。在这个main方法中,我们构造一个Student对象。代码如下:
public class Run { public static void main(String[] args) { Student stu1=new Student(); } }
在这句代码里面事实包含了两个操作,定义一个Student对象和构造一个Student对象。这两个步骤我们也可以分开来写。
public class Run { public static void main(String[] args) { Student stu1; stu1=new Student(); } }
三、访问属性和调用方法。
有了对象就会,那么我们就可以访问这个对象的属性和调用它的方法了。属性的访问格式是:
对象.属性名称
如果要赋值就是:
对象.属性名称=属性值
方法的调用格式:
对象.方法名称()
示例代码如下:
Student stu1; stu1 = new Student(); // 赋值 stu1.name = "小明"; stu1.age = 20; stu1.gender = true; stu1.number = 12; //访问 System.out.println(stu1.name); System.out.println(stu1.age); System.out.println(stu1.gender); System.out.println(stu1.number); //方法调用 stu1.dohomework();
4.3构造方法
构造方法
一、构造方法的特点
(1)每当创建给定类的实例时就调用的方法
(2)与类同名,但没有返回类型
(3)Java 为对象分配内存,初始化实例变量并调用构造方法
(4)两种构造方法
1、参数化构造方法
2、隐式构造方法
二、示例解析
我们先看看上一节的示例
Student stu1; stu1 = new Student();//调用构造方法
在构造对象时,就会自动调用构造方法。也许你会问,我们并没有定义构造方法,为什么会自动调用构造方法呢,这就是因为每一个类,只要你没有显示的定义构造方法,那么它都会有一个隐式构造方法。当然我们也可以显示的定义一个构造方法。回到Student类。显示的定义构造方法,代码如下:
public Student(){ System.out.println("调用了构造方法");//自动调用 }
注意构造方法必须和类同名,而且没有返回值,我们可以运行一下代码,会自动执行构造方法。所以构造方法经常会做一些初始化工作。
我们也可以定义多个拥有不同参数的构造方法,这叫做方法的重载,以后我们会详细讲解。示例代码如下:
public Student(String name,int number){ this.name=name; this.number=number; }
在main方法中也可以在构造Student对象是就初始化学生的姓名和学号了。
Student stu1;
stu1 = new Student("小明",123);//调用构造方法
三、this关键字
(1)用于任何实例方法内,指向当前对象
(2)this 的值指向对其调用当前方法的对象
(3)this 关键字可在需要当前类类型的对象引用时使用
一、什么是包
包允许将类组合成较小的单元(类似文件夹),使其易于找到和使用相应的类文件
包有助于避免命名冲突。在使用许多类时,类和方法的名称很难决定。有时需要使用与其他类相同的名称。包基本上隐藏了类并避免了名称上的冲突
包允许在更广的范围内保护类、数据和方法,可以在包内定义类,而在包外的代码不能访问该类
二、声明包和使用包
我们可以在新建一个类的同时定义包。在Eclipse操作如下: