面向对象三大特性:封装、继承和多态

//标注方法,用于编译器检查是否是覆盖
@Override //标注

Ctrl + shift + m:用于快速导入包

一、面向对象的封装 Encapsulation

含义:类中的成员改公开的公开,改隐藏的隐藏;

访问控制修饰符:public(公开的)、protected(受保护的)、默认不写的、private(私有的)

可见范围递减:如下

修饰符          本类      同包    子类    其它

public            yes         yes      yes     yes

protected      yes         yes      yes     No

Default          yes         yes      No      No

private           yes         No       No      No

1、属性封装

(1)属性私有 private修饰

(2)提供一组方法,读/写属性——getters/setters

具备可读属性name,方法名getXxx

public String getName(){
     return name;
}

具备可写属性name,方法名setXxx

public String setName(String name){

      this.name = name;  

}

2、方法封装

区分不同修饰符的特点:

public: 公开的,任何地方都可以访问;

protected:受保护的,主要是共子类使用的;

private:私有的,只有本类可以使用;

 public和private有什么区别? (BS/MS)

从项目设计和开发的角度:

public修饰:算作工作量,会增加后期维护成本;

private修饰:作为辅助方法,后期维护成本较低;

3、构造方法的封装

一般构造方法使用public修饰,作用是什么?

private Student(){}

其他类中newStudent();间接调用无参构造方法

如果将构造方法private修饰,影响?

private Student(){}

外界无法直接new Student();

用途:一种设计模式——单例模式

保证一个类在系统中最多只创建一个对象(实例)

好处:减少大量对象的创建,减少内存垃圾,降低GC启动频率,由于GC的启动对系统性能影响较大,所有单例模式可以提高系统性能。

练习:设计一个Emp类

(1)属性:id、name、salary、maleGender

         封装:全部私有private修饰

(2)构造方法:两个(无参、有参)

(3)getters和setters

(4)业务方法:work工作方法

二、面向对象的继承 Inheritance

1、含义
继承是软件复用的一种新式,当两个类存在逻辑上的“is-a”关系时,使用继承复用但不是所有的软件复用都用继承;继承是多态的前提,没有继承就没有多态。

class Animal{

String name;

eat方法

}

class Cat{

String name;

eat方法

}

class Dog{

String name;

eat方法

}

 继承语法:

(1)继承,使用关键字extends

class Super{//父类,超类,super是sub的父类}

//Sub “is-a” Super

class Sub extends Suber{//Sub是Super子类}

类图:表示类的信息,以及类间的关系

 

在day07包下新建testAnimal.java程序,main方法;为了便于复习,将多个类定义在一个源文件中。

注意:代码的层次结构,类体、方法体区分,每个类相对独立,不能嵌套。

(2)Java只能允许类的但继承

一个类最多只能有一个父类(C++允许的,Java不允许,好处:关系的简单性)

(3)Object类是所有类的共同父类——java.lang.Object类

任何类都直接或间接继承自Object类。

class Animal {  //父类就是Object,“is-a”object}

class Cat extends Animal{ //直接父类Animal}

(4)子类能够从父类继承到能继承的资源

前提:使用public或protected修饰,属性或方法;

注意:构造方法不能继承,没有意义(类名作为方法名);

(5)创建子类对象,会先创建父类对象

调用子类构造方法会先递归调用父类构造方法

原理:Java规定,任何构造方法的第一行默认就是super();

this关键字:表示当前对象

this.属性:用于区分同名的成员变量和局部变量;

this():表示调用本类其他构造方法;

super关键字:表示父类对象

super.属性:一般父类属性私有,无法直接访问,一般不用;

super.父类方法:指明调用父类的方法(方法覆盖语法);

super();:表示调用父类构造方法,可以传参数,指定调用哪个;注意:只能在构造方法第一行。

(方法的重载:Overload

一般在一个类中,方法名形态,参数表不同(类型、数量、顺序),

用途:简化用户的使用。)

方法的覆盖:Override

子类如果对父类的方法不满意,可以覆盖父类的方法;

覆盖:也称为重写,能够将父类的方法遮盖;

注意:

1)方法三要素要相同(方法名、参数表、返回值类型)

 2)访问控制修饰符范围不能更窄;

父类eat public,子类eat private不能,只能写public

3)声明抛出的异常类型不能更多(先记下,后续解释);

三、面向对象的多态 Polymorphism

1、含义:一种类型,呈现多种状态;

前提:没有使用继承就没有多态,使用父类的引用指向子类对象。

Animal a1 = new Cat();

父类                      子类

编译时类型       运行时类型

编译器理解         JVM理解

2、多态的三大定理:

(1)对象不变,new Cat();不能变为Dog对象;

(2)编译时只能调用编译时类型已定义的方法(能调用什么?)

         Animal类,只有eat和show方法,可以使用,没有catchMouse方法,暂时无法使用;

(3)运行时调用的是运行时类型覆盖后的方法(调用的是什么?<前提:非静态static>

         Cat覆盖了Animal中的eat方法,调用覆盖后的。

由于定理2,不能调用子类特有的方法(瑕不掩瑜);

多态,意义深远,优势较多,不足可以忽略,可以弥补。

数据类型转换:

1、自动类型转换

常熟在表数范围内、范围小->范围大、引用类型子类->父类、基本类型->包装类型;

2、强制类型转换

其它

Dog d1 = (Dog)a1;

d1.watchMouse();

编译时可以通过,运行时异常:类型转换异常(classCastException)

属于运行时异常,需要在编程时避免;

方法:在转换之前先判断a1指向对象的类型?

关键词instanceof“是不是”

 if(a1 instanceof Cat){//true

     Cat c1 = (Cat)a1;  //会执行

     c1.catchMouse();

}

 3、多态的分类(了解,不同角度分析类型变化)

(1)基本类型多态

         double d1 = ‘A’;  //char ->double 65.0

         double d2 = 123;  //int ->double 123.0

         double d3 = 123.5F;  //float ->double 123.5

2)类多态

前提:使用父类引用指向子类对象;

Animal a1 = new Cat();

Animal a2 = new Dog();

(3)方法多态

1)编译时多态——重载Overload

     编译时觉得调用哪个方法;根据参数来区分

2)运行时多态——覆盖Override

     运行时决定调用哪个方法

多态定理3:运行时执行的是子类覆盖后的方法,取决于子类是否被覆盖父类的方法;

如果子类未覆盖,还是父类的方法

4、多态的应用

前提:使用父类引用指向子类对象,将子类对象,当做父类类型看待;

Animal a1 = new Cat() ;

父类和子类,父类更抽象

面向父类编程 -> 面向抽象编程 -> 面向通用编程

思路:设计的程序,通用性强,降低成本。(可复用性、易维护性),更适合参与设计,比直接使用有些难度。

(1)方法的参数表中使用多态

需求1:动物园需要喂养动物

名词:动物园Zoo、动物Animal

动词:喂养feed

软件设计的最基本的原则:开闭原则

    对扩展开放,对修改关闭;软件需求的增加,会引起代码的变化,功能的增加,对软件结构影响很小。只需添加新的代码,无需修改旧的结构。(目的:提高可复用性、易维护性)

(2)在返回值类型中使用多态

需求2:动物园需要对外提供不同的动物

(3)一视同仁

将所有的子类对象作为Animal来看待,统一。

需求3:动物园给所有的动物吃汉堡。

 

posted @ 2017-07-11 10:41  漂浮的杜鹃花  阅读(289)  评论(0编辑  收藏  举报