一.封装
1、概念:
把客观事物封装成抽象的类,并且把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。也 就 是 说抽象数据类型对数据信息以及对数据的操作进行打包,将其变成一个不可分割 的实体,在这个实体内部,我们对数据进行隐藏和保密,只留下一些接口供外部调用。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
2、好处:
a.保护类中的信息,它可以阻止在外部定义的代码随意访问内部代码和数据。
b.隐藏细节信息,一些不需要程序员修改和使用的信息,比如取款机中的键盘,用户只需要知道按哪个键实现什么操作就可以,至于它内部是如何运行的,用户不需要知道。
c.有助于建立各个系统之间的松耦合关系,提高系统的独立性。当一个系统的实现方式发生变化时,只要它的接口不变,就不会影响其他系统的使用。例如 U 盘,不管里面的存储方式怎么改变,只要 U 盘上的 USB 接口不变,就不会影响用户的正常操作。
d.提高软件的复用率,降低成本。每个系统都是一个相对独立的整体,可以在不同的环境中得到使用。例如,一个 U 盘可以在多台电脑上使用。
3.如何封装
利用权限修饰符来描述方法体或属性。private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;default修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;protected修饰的属性或方法在同一个中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;public修饰的属性或方法外部类中都可以直接访问。
封装类似于黑箱操作,其设计要求是低耦合,高内聚。一个具体复杂的对象有很多的属性和方法,有些需要公开,有些不需要公开,就好比一个具体的人的信息,有些是public,有些是private,而有些是protecred,别人问到的时候对于怎么样的信息都有不同的态度。根据与这个人的关系来回答问题,封装的结果是输出结果,不问过程,其中,public是可以被任何变量访问的,private是该类私有的,protected类是受保护的,可以被该类所述的包内的所有的其他类访问,其子类也可以访问。
二.继承
继承是软件重用的一种形式,在声明新类时复用现有类的成员,然后赋予其新的功能,或修改原有的功能,通过继承,程序员在程序开发中已验证和调试过的高质量软件,可节省开发时间,也使系统更有可能得到有效的实现。
- 继承的概念
当程序员创建类时,可以指定新类从现有类中继承某些成员,而不需要完全从头开始声明新的成员。这个现有类称为超类或父类,新创建的类称为子类。子类也可以成为其他类的超类或父类
通常子类会添加自己的变量和方法,因此子类比其超类或父类更详细,表示更为特定的对象,典型的情况是,子类既有父类的功能,又有其专门的性能。
继承性在父类和子类之间建立起联系,子类自动拥有父类的全部成员,包括成员变量和成员方法,使父类成员得以传承和延续;子类可以改父类的成员,使父类成员适应新的需求;子类也可以增加自己的成员,使类的功能得以扩充。但是,子类不能删除父类的成员!!
Java语言只支持单重继承,可以通过接口实现多重继承。在单重继承中父类与子类是一对多的关系。一个子类只有一个父类;一个父类可以有多个子类,每个父类又可以作为父类再定义自己的子类。
2. 继承原则
类的继承包括以下基本原则。
①子类继承父类的所有成员变量,包括实例成员变量和类成员变量。
②子类继承父类除构造方法外的成员方法,包括实例成员方法和类成员方法。因为父类构造方法创建的是父类对象,子类必须创建自己的构造方法,创建子类自己的对象
③子类不能删除父类的成员。
④子类虽然继承了父类的私有成员,但子类不能使用父类的私有成员
⑤子类可以增加自己的成员变量和成员方法。
⑥子类可以重新定义父类成员(方法重写)。
- 子类的声明
在Java语言中,子类对父类的继承是通过extends关键字来实现的。语法格式如下:
[修饰符] class类 [extends 父类] [implements 接口列表]
其中,extends说明当前声明的类将要继承父类的属性和方法。父类中哪些属性和方法将被继承取决于父类对成员的访问控制:
①子类对父类的私有成员没有访问权限。
②子类对父类的公有成员和保护成员有访问权限。
③子类对默认权限成员分两种情况,对同一包中的父类的默认权限成员具有访问权限,而对不同包中父类的默认权限成员则没有访问权限。
4. 子类方法的覆盖
在面向对象语言的程序设计中,子类可以改写从父类中继承来的某个方法,形成与父类方法同名,解决的问题也相似,但具体实现和功能却不尽一致的新方法。
定义与父类完全相同的方法以实现对父类方法的覆盖是,必须注意以下几点:
①完全相同的方法名。
②完全相同的参数列表。
③完全相同的返回值类型。
注意:在满足上述三个条件的同时,还必须保证访问权限不能缩小。
5.super关键字
在子类的方法中,可以使用关键字super调用父类成员。super的使用有两种方法。
①调用父类的构造方法
父类的构造方法不能够被继承,但在子类的构造方法体中,可以使用super调用父类的构造方法。语法格式如下:
super([参数列表]);
其中,参数列表是父类构造方法的参数列表。
②调用父类的同名成员
子类继承父类的成员,当子类没有重定义父类成员时,则不存在同名成员问题。子类的对象访问的都是父类声明的成员变量,调用的也都是父类定义的成员方法,所以不需要使用super。
当子类重定义了父类成员时,则存在同名成员问题。此时,在子类方法体中,成员变量和成员方法均默认为子类的成员变量或成员方法。如果需要引用父类的同名成员,则需要使用super引用。在以下两种同名成员情况下,需要使用super引用。
1)子类隐藏父类的成员变量
当子类成员变量隐藏父类的同名成员时,如果需要访问被子类隐藏的父类的同名成员变量,则需要使用super只带父类的同名成员变
量,则需要使用super指代父类的同名成员变量。语法格式如下:
super.成员变量;
2)子类覆盖父类成员方法
当子类成员方法覆盖父类同名成员方法时,如果需要调用被子类覆盖的父类成员方法,则可以使用super调用父类的同名成员方法。
语法格式如下:
super.成员方法([参数列表]);
三.多态
类的多态性提供了类中的方法设计的灵活性和执行的多样性。通过多态,就能对“对通用情况进行编程”,而不是“对特定情况编程”。
多态的特别之处是使程序能够处理类层次中共享同一父类的对象,就好像他们都是父类的对象一样。
多态性的概念
在面向对象语言中,多态性是指一个方法可以有多种实现版本,即“一种定义,多种实现”。对于一个方法的多种实现,在程序运行
时,系统会根据方法的参数或调用方法的对象自动选择一个方法执行,不会产生混淆和混乱。例如,算数运算中不同类型的数据的混合
运算就是一个典型的多态运用。
类的多态性表现为方法的多态性,下面主要讨论在不同层次的类中以及在同一个类中多个同名方法之间的关系问题。方法的多态性主要有方法的重写和重载。
代码实例:
public class main {
/**
* @param args
*/
public static void main(String[] args) {
//分别将animal实例化成三种动物,
Animal an = new Dog();
an.cry();//根据每种动物自身的方法,自动选择内容
an = new Cat();
an.cry();
an = new UnknowAnimal();
an.cry();
}
}
//基本类,包含一个基本方法
class Animal{
public void cry(){
System.out.println(“我不知道自己是什么动物。”);
}
}
//声明子类,继承基本类,但有自己的方法
//实例化后优先使用自身的方法。
class Dog extends Animal{
public void cry(){
System.out.println(“这是一条狗。”);
}
}
class Cat extends Animal{
public void cry(){
System.out.println(“这是一只猫。”);
}
}
//这个子类自身没定义方法,实例化后会使用从父类继承来的方法
class UnknowAnimal extends Animal{
}