Java 面向对象 多态

来源:互联网 发布:数控铣创意图案编程 编辑:程序博客网 时间:2024/05/21 17:13

多态设计思想

 

Animal a = newCat();

 

如上图所示 : 其实就是一个子类的实例赋值给其父类类型的变量。

此时对象a有两种类型

1.编译时:声明的是什么类型,就看作是什么类型

Animal 类

2.运行时:创建对象的类型,即实用对象的真正类型

Cat       类

 

 

Animal a = null;

a = new Dog();

a = new Cat();

 

可以看出a是有多重形态的。

多态的作用:当把不同的子类对象都当作父类的类型来看,可以屏蔽不同子类对象之间的实现差异,

从而通过通用的代码达到通用编程,以适应需求的不断变化。

 

zum.B.

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 // The superClass Animal Animal{ class void eat(){ public System. out. println("Animal is eating"); // The subClass Dog class extends Animal Dog void eat(){ public System. out. is eating bone! Wong Wong"); // The subClass Cat class Cat extends Anima Z void eat(){ public System. out. println("Cat is eating fish! Meow Meow"); // The FeederClass used to feed animals class Feeder void feed(AnimaZ anm){ public anm. eat(); // Here now is a TestDemo UsingPolymorphism{ public class void main(String[] args public static // 1st new a feeder new Feeder(); Feeder fd // 2nd new a dog new Dog(); Dog dg //3rd new a cat new Cat(); Cat ct //4th feed the dog and the cat fd. feed(dg); fd. feed(ct);

 

Dog is eating bone! Wong Wong Cat is eating fish! Meow Meow [Finished in ø.7s]

多态时方法调用

前提:必须先存在多态情况

存在父类:SuperClass,子类:SubClass 方法:doWork

 

引用类型的强制类型转换

字段不存在多态

通过对象调用字段,编译时期就已经决定了调用那一块内存空间的数据.

--------->字段不存在覆盖的概念,在多态时,不能有多态特征(在运行时期体现子类特征).

只有方法才有覆盖的概念.

 

组合关系

继承关系:子类可以继承到父类中部分的成员,那么此时子类是可以修改到父类的信息的.

继承关系破坏封装,为了复用代码可能会让子类具有不该具有的功能.

为什么引入继承:为了代码复用问题.

解决代码复用问题,不一定非要使用继承,也可以使用包含关系”(has  A).

 

 

初始化代码块

使用普通初始化代码块

 

使用静态初始化代码块(先初始化所有静态代码块--父类代码块--父类构造器--子类代码块--子类构造器)

特点:所在类被加载后就执行,和静态方法一样不能访问外部实例成员。

 优先于主方法执行,优先于构造代码块执行,不管有创建多少对象,静态代码块只执行一次,可用于给

 做应用的初始化操作,一般用于做初始化操作,家在资源等操作。

 

单例设计模式

目的:保证整个应用中某一个类有且只有一个实例(一个类在内存只存在一个对象),即所有指向该类型实例的引用都指向同一块内存空间。

饿汉式:单例类被加载进内存,对象就建好了

写单例模式的步骤单讲饿汉式.

     1):必须在该类中,自己先创建出一个对象.

     2):私有化自身的构造器,防止外界通过构造器创建新的对象.

      3):想外暴露一个公共的静态方法用于获取自身的对象.

 

懒汉式:对象是方法第一次需要时才创建,也称对象的延迟加载

       

 

final修饰符

继承关系最大弊端是破坏封装:子类能访问父类的实现细节,而且可以通过方法覆盖的形式修改实现细节.

final 类

表示最终的类,该类不能再有子类(只要满足以下条件就可以把一个类设计成final类)

1,某个类不是专门为继承而设计的

2,处于安全考虑,类的实现细节不许改动,不准修改源代码

3,确信该类不会再被拓展

��javafinal修饰的类有很多,比如八大基础数据类型的包装类和String类等

final 方法

最终的方法,表示该类不能够被子类覆盖(需要用final修饰的方法)

1,在父类中提供的统一的算法骨架,不准子类通过方法覆盖来修改,此时使用final修饰,模板方法设计模式

2,在构造器中调用的方法(初始化方法),此时一般使用final修饰

��final修饰的方法,子类可以调用,但是不能覆盖

final 变量

表示最终的变量,常量,该变量只能赋值一次,不能再赋值

1,final变量必须显示地指定初始值,系统不会为final字段初始化

2,final变量一旦被初始化,就不能被重新赋值

3,常量名规范全部大写

 

��final是唯一 一个可以修饰局部变量的修饰符---》具体后续局部内部类

    一般我们会专门定义一个常量类,专门用来存储常量数据

 

public static final double PI = 3.141592653589793 ;

public static final int MAX_VALUE = 1000;

 

 

工具类的设计

工具类如何设计:工具在开发中其实只需要存在一份即可.

      1):如果工具方法没有使用static修饰,说明工具方法得使用工具类的对象来调用.

           此时把工具类设计为单例的.

      2):如果工具方法全部使用static修饰,说明工具方法只需要使用工具类名调用即可.

            此时必须把工具类的构造器私有化(防止创建工具类对象调用静态方法).

----------------------------------------------------------------------

一般的,首选第二种,简单.JDK中提供的工具类都是第二种.java.util.Arrays.

原创粉丝点击