封装、继承、多态

来源:互联网 发布:网络整合营销名词解释 编辑:程序博客网 时间:2024/06/01 23:23

封装:

面向对象的三大特征:封装、继承、多态。其中,封装就是将类的对象属性隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的访问和操作。简间说就是隐藏对象的属性及实现细节,对外提供公共访问方式 。
封装的手段就是修改属性可见性来限制对属性的访问,为每个封装属性提供赋值和取值方法。
封装的好处就是能隐藏实现细节,方便加入对属性存储控制语句,限制不合理操作。代码示例在static关键字学习中已展示了数组常用操作功能的封装。

继承:

java中继承提高了代码的复用性,让类与类之间有了关系。正是了有了这关系,才有了多态的属性。与继承相关的关键字 extends 。

1. java中关系继承的使用的几点注意:
1)java中只支持单继承,不支持多继承,但是保留了这种机制,并用另一种形式来完成这种机制——多实现。
2)使用一个继承体系中的功能,原则:先查阅父类功能描述,然后创建子类对象使用功能。
3)千万不能为了获取其他类的功能,简写代码而使用继承,必须是类与类之间有所属关系才可以继承。

2. 子类继承父类后,类中成员的特点:
1)成员变量:如果父类中出现非私有的同名成员变量时(若父类中成员变量是私有的,那么继承的子类同样不能使用),子类要访问本类中的变量用this,子类要访问父类中的变量用super。
2)成员函数:继承机制使成员函数产生了覆盖(重写)特性,该特性保留了父类的功能函数定义,但重写了子类的功能函数内容。子类覆盖父类,必须保证子类大于等于父类。
3)构造函数:在对子类进行初始化时,父类的构造函数也会执行,因为子类每一个构造函数第一行都会有默认的super(),super()会访问父类中空参数构造函数(当然也可以手动按指定执行父类中带参数的构造函数,不管默认还是指定,必须执行父类构造函数)。

3. 继承的应用:
代码示例:
class Fu{int num ;//父类构造函数Fu(){};Fu(int num){this.num = num;}void show1(){System.out.println("Fu show");}void speak(){System.out.println("Fu speak");}}class Zi extends Fu{//int num = 5;//与父类同名变量,这种情况一般开发中不出现//子类构造函数Zi(){//super();//默认执行父类构造函数}Zi(int num){//指定执行父类构造函数super(num);}//想在子类访问父类中的numvoid show2(){System.out.println("Zi show"+"..."+super.num);}//子类speak()重写了父类中的speak(),但是还保留了父类中speak()的定义。void speak(){//指定执行父类的功能super.speak();System.out.println("Zi speak");}}class ExtendsDemo1{public static void main(String[] args){//子类创建对象,使用功能Zi z = new Zi();//执行带参数构造函数Zi z1 = new Zi(6);//子类继承了父类的show1()z.show1();z.show2();//子类覆盖了父类的speak();z.speak();}}

4. 继承的弊端:
事物都有两面性,继承虽然提高了代码的复用性,让类与类之间有了关系,但是也破坏了对象的封装性,因此有时候便需阻止某些类的继承,这时final关键字应运而生。
final关键字作为一个修饰符,有如下特点:
1)可以修饰类,函数,变量。
2)被final修饰的类不可以被继承。
3)被final修饰的函数不能被覆盖。
4)被final修饰的变量是一个常量,且只能在定义时被赋值一次。常量通常用大写字母取一个名字,便于阅读。
5)类部类定义在类中的局部变量时,只能访问该局部被final修饰的局部变量。
代码示例:
//final修饰类final class Final{//final修饰变量final static double PI = 3.14159;//PI = 5//不可以//final修饰函数,final void show(){System.out.println("不可以被覆盖"+"..."+PI);}}class FinalDemo{public static void main(String[] args){//访问常量,直接用类名System.out.println(Final.PI);}}

多态:

多态可以简单理解成事物存在的多种体现形态,通过分离做什么和怎么做,从另一角度将接口和实现分离开来。有一条规律:多态自始自终都是对象在变化。
1.  多态代码实现中的体现
父类的引用指向自己子类的对象,父类中的引用也可以接收自己的子类对象。
向上转型:Fu  f  = new  Zi();
向下转型:Zi  z = (Zi)f;
2. 多态使用的前提条件
类与类之间必须有关系(继承或者实现),子类必须覆盖父类中的某些或全部功能。
3. 多态使用的优点和缺点
多态的出现改变了代码的组织结构和可读性,大大提高了代码的可扩展性,但是多态中只能使用父类引用父类中的成员。
4. 多态中的成员的特点
成员函数:
在编译时期,是参考引用型变量所属的类中是否有该调用方法,有则通过,没有不通过;在运行时期,参考对象所属类中是否有该调用方法。
成员变量:
不管是编译还是运行时期,都是参考对象所属类中是否有该变量。
静态成员:
不管是编译还是运行时期,都是参考引用型所属类中是否有该调用方法或变量。
5. 多态的应用
代码示例:
abstract class Animal{abstract void eat();}class Cat extends Animal{//覆盖父类中的功能public void eat(){System.out.println("吃鱼");}//子类中特在的功能public void catchMouse(){System.out.println("抓老鼠");}}class Dog extends Animal{public void eat(){System.out.println("吃骨头");}//子类特有功能public void WatchDoor(){System.out.println("看门");}}class PolyDemo{public static void main(String[] args){//向上转型Animal c = new Cat();//两种调用方式function(c);function(new Dog());}//多态分离方法public static void function(Animal a){//父类中存在的功能a.eat();//利用向下转型,调用对象特有功能//instanceof 关键字用来比较两个对象是否同一类型if(a instanceof Cat){Cat c1 = (Cat)a;c1.catchMouse();}else if (a instanceof Dog){Dog d1 = (Dog)a;d1.WatchDoor();}}}


0 0
原创粉丝点击