封装继承多态

Posted javasan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装继承多态相关的知识,希望对你有一定的参考价值。

一、封装

1、封装的好处:[1] 隐藏类的实现细节,保证数据的安全性。

         [2] 不允许外部程序直接访问,而通过统一的方式(setter/getter)对隐藏信息的操作和访问

         [3] 方便加入校验控制逻辑

         [4] 方便后期维护。

2、封装的步骤:[1] 属性私有化。修改属性的修饰符为private。

         [2] 提供共有的setter/getter方法。对属性进行读写。

         [3] 在setter/getter中加控制逻辑。对写入的数据进行正确性校验。

二、静态常量

被static final修饰的量,称为静态常量,归类所有。一般用于存储不会经常发生变化的量。

三、

使用关键字package创建一个包。package必须写到源代码第一句。

1、包的好处:[1] 解决类的命名冲突问题。

        [2] 便于管理

        [3] 涉及包访问权限,更好的保护类、属性、方法。

 2、包的命名规则:[1] 包名用小写字母,不能以.开头和结尾。

           [2] 包名一定要唯一。

           [3]包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名。e.g:com.baidu

3、编译带包的类:javac –d  目标地址   源文件  e.g:包com.bd下的Test.java文件,javac –d  ./  ./com/bd/Test.java(这个编译后的文件在bd文件夹)

  e.g:现有Test.java文件、Dog.java文件,若Test.java文件中有创建Dog对象语句:

  从当前(./)目录找,若找不到Dog.class,找Dog.java并编译成Dog.class 使用

    [1]当源文件Dog.java和Test.java定义在不同包时,需要先编译Dog.java,然后在编译Test.java。

    [2]当Dog.java(或.class)和Test.java在同一目录/包下,编译Test.java时,自动把Dog.java 一起编译。

4、工程化的包目录:工程中,创建src目录用于存放源代码(.java);创建一个bin目录用于存放字节码(.class)

  e.g:包com.bd下的Test.java文件:①编译:进入src目录下,javac –d  ../bin  ./com/bd/Test.java

                   ②运行:进入bin目录下,java  com.bd.Test

5、导包:若Test类用到的Dog类不是当前目录的Dog,此时需使用关键字import 告知Test类Dog类的位置。

   e.g:import com.bd2.Dog / import com.bd2.*

      特别的,当一个程序用到两个的同名类时:

技术图片

四、静态导入

当一个类中定义的属性和方法都是静态时,可以考虑使用静态导入。import static com.bd.Calc.*;

五、继承

为减小重复性代码,把一些类共有的属性和方法提取到一个父类/超类中。在程序符合is a关系,子类拥有父类非私有的属性和方法。继承使用关键字extends

继承特性:[1] 单根性。在java中,类的继承是单继承。一个类只能有一个直接父类。

       [2] 传递性。C继承于B,B继承于A,C也具有A的特性和行为。

六、访问修饰符

java中,类的访问权限只有两种:①public 公共的,可被同一项目中所有的类访问。 ②default 默认的,可被同一个包中的类访问。

    成员(成员变量或成员方法)4类访问修饰符。public、protected、默认(friendly)、private。

      ①public:公共的。访问权限最大

      ②protected:受保护的。①子类都可见  ②同包可见

      ③默认:包访问权限。同包可见。

      ④private:私有的。只有本类可见。

七、多级继承

继承关系的初始化顺序:父类属性初始化→调用父类构造方法→子类属性初始化→调用子类构造方法

  1、如果子类的构造方法中没有通过super显式调用父类的有参构造方法,则系统会默认先调用父类的无参构造方法。

  2、如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。

  3、如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。

  4、如果存在多级继承关系,会多次向更高一级父类用,一直到执行顶级父类Object类的无参构造方法为止。

八、final和abstract

①final可以用来修饰类,写在class(不能被继承)、方法,写在返回值前(不能被重写)和属性,一般和static结合使用(不能被修改),不能修饰构造方法。

②abstract可以用来修饰类(抽象类,需要被继承)和方法(抽象方法,需要子类被重写),不能用来修饰属性和构造方法。

  (1)抽象类不能实例化

  (2)抽象方法一定位于抽象类中。抽象类中可以没有抽象方法

  (3)子类继承抽象父类,一定要实现抽象类中的抽象方法(完全性重写,称为方法的实现,实现是一种特殊的重写),除非子类也是抽象类。

③注意:final修饰基本类型变量,其值不能改变。但final修饰引用类型变量,栈内存中的引用不能改变,但所指向的堆内存中的对象的属性值仍可以改变。

例如:     final Dog dog = new Dog("欧欧");

          dog.name = "美美";//正确

          dog = new Dog("亚亚");//错误

九、多态

在程序中,同一引用类型,由于实例不同,产生的结果不同。多态增强了程序的可拓展能力,从而提高了可维护性。

1、多态的存在要有3个必要条件:要有继承,要有方法重写,父类引用指向子类对象

1、多态的实现方式:[1] 父类引用子类。(本质)

           [2] 父类作为方法的形参实现多态

           [3] 父类作为方法返回值实现多态

2、多态中类型转换:[1]自动类型转换(也称向上类型转换):父类类型 父类对象 = new 子类类型();

         [2]强制类型转换,前提条件:父类对象本质是具体的子类类型,才能转换成相应的子类类型:子类类型 子类对象 = (子类类型)父类对象

        若父类对象调用子类特有的方法时,一定要结合instanceof关键字进行强制类型转换。(子对象  instanceOf  或者接口)

十、final、finally、finalize的区别

1、final,①修饰类,不能被继承。②修饰方法,不能被重写。③修饰变量,在声明时给定初值,以后只能读取,不可修改。

2、finally,在异常处理时执行最终操作的模块。若有finally,不管是否发生异常,finally语句都会被执行。

3、finalize方法名。Java 使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 

以上是关于封装继承多态的主要内容,如果未能解决你的问题,请参考以下文章

JAVA面向对象,继承、封装、多态

举例说明java面向对象的封装继承多态

0面向对象三大机制 封装继承多态

0面向对象三大机制 封装继承多态

封装,继承,多态

JavaSE——:封装继承多态