三大特征:封装,继承,多态
目录
特征一:封装
-
封装是什么:
面向对象编程语言对客观世界的模拟。
(客观世界指的是对象的状态信息都被隐藏在对象内部外界无法直接操作和修改)
分层理解:1.将对象的信息隐藏在对象内部。
2.不允许外部程序直接访问对象内部信息。
3.通过该类所提供的方法来实现对内部信息的操作和访问。
-
封装的含义:
把该封装的封装,该暴露的暴露。
(即实现良好的封装所具备的条件)
分层理解:1.将对象的成员变量和实现细节隐藏起来,不允许外部直接访问。
2.把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作。
-
实现封装的目的
1.隐藏类的实现细节
2.让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理使用
3.可进行数据检查,从而有利于保证对象信息的完整性
4.便于修改提高代码的可维护性。
-
关键字:--->访问控制符
private | 默认不写 | protected | public |
在类中 | 在同包内 | 在子类当中 | 范围在任意地方都可以 |
修饰的方法和属性不能被继承 |
-
getter和setter方法:
getter | setter |
用于获取属性的值 | 用于修改属性的名 |
语法格式: 属性 数据类型 get变量名(){ return 变量名; } | 语法格式: 属性 数据类型 set变量名(int new变量名){ 变量名 = new变量名; } |
格式: get变量名和 new变量名中的变量名的首字母大写 |
特征二:继承
在程序中,继承描述的是事物之间的所属关系,通过集成可以在多种事物之间形成一种关系体系
-
在Java中类的继承:
指得是在一个现有的类的基础上去构建一个新的类,构建出的新的类被称为子类,子类会自动拥有父类所有可继承的属性和方法
-
继承的对象:
可见的成员(成员指的是:成员变量和成员方法)
继承的格式
class 子类 extends 父类(){ } |
-
继承的使用---->Java是单继承,可多层继承
1.在程序中,如果想声明一个类继承另一个类,需要使用关键字extends
2.继承的优点:减少冗余重复代码,便于维护
-
继承中修饰符protected的使用:
1.在直接子类中都可以使用
父类中的使用 | protected 数据类型 父类; |
直接子类中的使用 | this.父类 |
2.子类对象外部无法访问(即不可挎包使用---->解决挎包问题的方法:方法重写(即扩大使用范围));
继承后方法重写的原因:子类无法使用父类中定义的方法。
3.不能再创建对象之后,用对象去.(点)父类中的protected属性。
-
方法重写与方法重载的区别:
方法重写 | 方法重载 |
同方法名 | 同方法名 |
同参数列表 不能抛出更多异常 | 参数列表不同(必须的) |
访问范围需变化,其他位置不变 (子类重写的访问权限>=父类的访问权限 子类重写的返回值类型<=父类的返回值类型) | 与返回值无关 |
方法签名不可变(只允许访问范围可升级)
《---方法签名(方法名和参数列表)----》 | 即同名不同参 |
-
抽象类abstract class:
在某种环境下,不满足完成一个类的条件呢,此时需要保留已完成的和未完成的。
1.可以有抽象方法,也可以没有抽象方法
2.非抽象方法中是可以有具体功能的方法
3.抽象类中不能创建(实例化)对象,但有构造方法
(构造方法仅仅是是用来初始化父类型中的成员)
4.抽象类的用途:
a)半成品,做模板
b) 天生的父类
c) 举例子描述,比如设计的各个环节,其中有未完工的部分
5.抽象类的修饰符:
private 修饰 | static 修饰 |
不可用 | 不可用 |
原因是必须被子类继承后重写,权限不能 为 private 。 | 原因是加上静态 static 关键字后, 调用方式是 类名.静态方法名,而该方法还没有实现,调用无意义, |
-
this和super的区别:
this和super不可同时存在 (少参会调多参) | |
this(代表当前类的实例) | super |
this()调用本类的有参构造方法 且必须放于构造方法的第一行 (只能调用一个构造方法) | super()默认调用父类的构造方法 |
this. 调用类中的属性和方法, 但不能调用构造方法
|
-
接口 interface :
1. 接口中的成员属性:都是常量
2. 命名规则:全大写,多单词以下划线连接
3.极端抽象类(jdk7中) ,方法全是抽象方法(jdk7中普通方法不能在接口中定义)
4. 里面只有常量和抽象方法,以及静态方法(jdk8)和默认方法(jdk8)
(静态方法--->属于类,被类的所有实例共享,接口实现类对象不能调用接口中的静态方法)
jdk8中的函数式接口:指一个接口有且只有一个抽象方法。(注解标记为:@FunctionalInterface,以此检查)
5.关系:(实现关系属于继承)
类与类 | 接口与接口(likeA) | 接口与类 | 类与抽象类 | 接口与抽象类 |
继承关系(单继承) | 继承关系(多继承) | 实现关系 | 继承关系(单继承) | 实现关系 |
extends | interface A extends B,C,D | class A implements B,C,D
一般以Impl结尾 | extends | implements |
6.接口实现类需要实现接口中所有抽象方法。(实现类和接口之间是多态关系)
-
最终类 final class :
1. 不能被任何类继承,即没有子类,没有多态!
2.里面的方法都是最终方法,不能被修改。
3.一般用来做一个工具类 (一个类没有继承任何一个类,哪么类默认继承Object类)
特征三:多态
-
语法要求:
1.必须有关系(继承或实现);
2.父类型引用指向子类型实例。
-
多态现象的发生:
必须存在重写的方法,此时才有多态现象
-
多态中Java引用的两个类型;
编译时类型(看左) | 运行时类型(看右) |
父类引用的方法是否存在 | 父类实例的重写后的该方法 |
类型的判断和转换:instanceof 判断左边的类型是否是右边的实例(类型转换异常:ClassCastExpection) | |
参数多态: 在进行api设计时,一般都是参数多态 不会写一个具体的子类,而是写父类型或接口类型 ( 子类当做父类来用) |
-
内部类(标识:$)
成员内部类 |
静态内部类 |
局部内部类 |
匿名内部类( jdk8 匿名内部类中外部对象的 final 可以省略 ) |
-
lambda 表达式 : (参数列表)-> 执行语句