封装继承多态
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() 方法以整理系统资源或者执行其他清理工作。
以上是关于封装继承多态的主要内容,如果未能解决你的问题,请参考以下文章