一.面向对象(上)
1.面向对象的概念
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。
1,封装性
封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想。例如,用户使用电脑,只需要使用手指敲键盘就可以了,无需知道电脑内部是如何工作的,即使用户可能碰巧知道电脑的工作原理,但在使用时,并不完全依赖电脑工作原理这些细节。
面向对象的特点主要可以概括为封装性、继承性和多态性。
2.类与对象
面向对象的编程思想,力图让程序中对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,面向对象的思想中提出了两个概念,即类和对象。其中,类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。
类的定义:
在面对对象的思想中最核心的就是对象,为了在程序中创建对象,首先需要定义一个类。类是对象的抽象,它用于描述一组对象的共同特征和行为。类中可以定义成员变量和成员方法,其中成员变量用于描述对象的特征,也被称作属性,成员方法用于描述对象的行为,可简称为方法。
在Java中,定义在类中的变量被称为成员变量,定义在方法中的变量被称为局部变量。如果在某个方法中定义的局部变量与成员变量同名,这种情况是允许的,此时方法中通过变量名访问到的是局部变量,而并非成员变量。
上面的代码中,在Person类中的speak()方法中有一条打印语句,访问了变量age,此时访问的是局部变量age,也就是说当有另外一个程序来调用speak()方法时,输出的值为60,而不是10。
对象的创建与使用:
应用程序想要完成具体的功能,仅有类是远远不够的,还需要根据类创建实例对象。在Java程序中可以使用new关键字来创建对象,
在实例化对象时,Java虚拟机会自动为成员变量进行初始化,针对不同类型的成员变量,Java虚拟机会赋予不同的初始值,如下表所示:
当对象被实例化后,在程序中可以通过对象的引用变量来访问该对象的成员。需要注意的是,当没有任何变量引用这个对象时,它将成为垃圾对象,不能再被使用。
类的设计:
在Java中,对象是通过类创建出来的。因此,在程序设计时,最重要的就是类的设计。
类的封装:
在设计一个类时,应该对成员变量的访问作出一些限定,不允许外界随意访问,这就需要实现类的封装。
所谓类的封装是指在定义一个类时,将类中的属性私有化,即使用private关键字来修饰,私有属性只能在它所在类中被访问,如果外界想要访问私有属性,需要提供一些使用public修饰的公有方法,其中包括用于获取属性值的getxx方法和设置属性值的setxx方法。
【任务3-1】超市购物程序设计
代码:
结果
3.构造方法
构造方法的定义:
构造方法的重载:
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值。
4.this关键字
例如都声明为age。但是这样做又会导致成员变量和局部变量的名称冲突,在方法中将无法访问成员变量age。为了解决这个问题,Java中提供了一个关键字this来指代当前对象,用于在方法中访问对象的其它成员。
5.垃圾回收
例如都声明为age。但是这样做又会导致成员变量和局部变量的名称冲突,在方法中将无法访问成员变量age。为了解决这个问题,Java中提供了一个关键字this来指代当前对象,用于在方法中访问对象的其它成员。
6.static关键字
静态变量:
在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据。只有通过new关键字创建该类的实例对象后,系统才会为每个对象分配空间,存储各自的数据。
有时候,开发人员会希望某些特定的数据在内存中只有一份,而且能够被一个类的所有实例对象所共享。例如某个学校所有学生共享同一个学校名称,此时完全不必在每个学生对象所占用的内存空间中都定义一个变量来表示学校名称,而可以在对象以外的空间定义一个表示学校名称的变量,让所有对象来共享。具体内存中的分配情况如下图所示:
静态方法:
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。
静态代码块:
在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。
当类被加载时,静态代码块会执行,用于类只加载一次,因此静态代码只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。
7.成员内部类
成员内部类:
在Java中,允许在一个类的内部定义类,这样的类称作内部类。这个内部类所在的类称作外部类。根据内部类的位置、修饰符和定义的方式可分为:成员内部类、静态内部类、方法内部类。
在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称为成员内部类。在成员内部类中,可以访问外部类的所有成员。
【任务3-2】银行新用户现金业务办理
代码:
结果
二.面向对象(下)
1.类的继承
继承的概念:
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称为子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
在类的继承中,需要注意一些问题,
1.在Java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个父类,例如下面这种情况是不合法的。
2.多个类可以继承一个父类,
3.在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C类继承自B类,而B类又可以去继承A类,这时,C类也可称作A类的子类。例如下面这种情况是允许的。
4.在Java 中一个子类只能拥有一个父类,但一个父类可以拥有多个子类。
重写父类方法:
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承方法进行一些修改,即对父类的方法进行重写。
需要注意的是,在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
super关键字:
当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在Java中专门提供了一个super关键字用于访问父类的成员。例如访问父类的成员变量、成员方法和构造方法。
2.final关键字
final关键字修饰类:
Java中的类被final关键字修饰后,该类将不可以被继承,也就是不能够派生子类。
final关键字修饰变量:
Java中被final修饰的变量称为常量,它只能被赋值一次,也就是说final修饰的变量一旦被赋值,其值不能改变。如果再次对该变量进行赋值,则程序会在编译时报错。
3.抽象类和接口
抽象类:
接口:
在上面的语法中,一个接口可以有多个父接口,他们之间用逗号隔开。Java使用接口的目的是为了克服单继承的限制,因为一个类只能有一个父类,而一个类可以实现多个接口。接口中的变量默认使用“public static final”来修饰,即全局常量,接口中定义的方法默认使用“public abstract”来修饰,即抽象方法如果接口声明为public,则接口中的变量和方法全部为public
由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法。此时需要定义一个类,并使用implements关键字实现接口中所有的方法。一个类可以在继承的同时实现多个接口,在implements子句中用逗号隔开。接口的实现类声明格式如下:
[<修饰符>] class <类名> [extends <超类名>] [implemente <接口 1>,<接口 2>,...]+
如果在一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。接口是有常数和抽象方法组成的特殊类,是对抽象类进一步抽象。
【任务4-1】USB接口程序设计
代码:
结果:
4.多态
多态的概念:
在设计一个方法时,通常希望该方法具备一定的通用性。例如要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声。在同一个方法中,这种由于参数类型不同而导致执行效果各异的现象就是多态。继承是多态得以实现的基础。
在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对像特征的不同,得到不同的运行结果。
多态的类型转换:
在多态的学习中,涉及到将子类对象当作父类类型使用的情况,此种情况在Java的语言环境中称之为“向上转型”,
将子类对象当作父类使用时不需要任何显式地声明,需要注意的是,此时不能通过父类变量去调用子类中的特有方法。
Object类:
在JDK中提供了一个Object类,它是类层次结构的根类,每个类都直接或间接继承自该类,所有对象(包括数组)都实现了这个类的方法。Object类中的常用方法如下表所示。
匿名内部类:
在编写Java程序时,在类里面定义的类称之为内部类(Inner Class),内部类是外部类的一个成员。Java内部类可以分为:成员内部类、方法内部类和匿名内部类等。
【任务4-2】模拟物流快递系统程序设计
代码:
结果