面向对象—封装、继承、多态
一、封装
1.1 原则
- 把不需要对外提供访问的内容都隐藏起来,仅对外提供公共访问方法
1.2 this关键字
作用
- 代表自身类的对象
- 在自身构造方法内部引用其他构造方法
- 引用成员变量
- 引用成员函数
构造函数间的调用
- this.xx 调用的是成员的属性和成员方法
- this(xx) 调用的是本类中的对应参数的构造函数
this语句:用于构造函数间相互调用。只能定义在构造函数第一行。因为初始化要先执行
- 非静态,不能再静态方法内部使用
1.3 static关键字
- Static:静态
- 用法:是一个修饰符,用于修饰成员(成员常量,成员变量,成员函数),当成员被静态修饰后就多了一个调用方法,除了可以被对象调用外,还可以直接被类名调用,所以static修饰的变量也叫类变量。类名.静态成员
- 特点
- 随着类的加载而加载
- 优先于对象存在
- 被所有对象共享
- 可以直接被类调用
- 实例变量和类变量的区别
- 存放位置
- 类变量随着类的加载而存在于方法区中
- 实例变量随着对象的建立而存在于堆内存中
- 生命周期
- 类变量生命周期最长,随着类的消失而消失
- 实例变量随着对象的消失而消失
- 存放位置
静态使用注意事项
- 静态方法只能访问静态成员。非静态方法都可以访问
- 静态方法不可以定义this、super,因为静态优先于对象存在
- static关键字不能修饰成员方法或构造方法内部的变量
- 主函数是静态的
静态利弊
- 利:节省内存空间
- 弊:生命周期过长,访问出现局部性(只能访问静态)
1.4 主函数main
格式
public static void main(String[] args){}
- public:代表该函数访问权限最大
- static:代表主函数随着类的加载就已经存在
- void:主函数没有具体返回值
- main:不是关键字,但可以被虚拟机识别
(String [] args):函数的参数。参数类型是一个数组,该数组元素是字符串。即字符串类型的数组
主函数是固定格式的,因为要被JVM识别,JVM调用主函数时,传入的是new String[0]
1.5 静态代码块
- 特点:随着类的加载而执行,只执行一次,用于给类初始化
格式
static{ 执行语句; }
二、继承
2.1 继承说明
- 作用
- 提高代码的复用性
- 让类与类之间产生了关系,有了这个关系才有了多态的特性
- 说明
- 子类拥有父类的所有属性
- 子类拥有父类的所有方法
- 子类不可拥有父类的构造方法
- 子类类型是父类类型
- Java语言中只支持单继承,不支持多继承
2.2 重写(覆盖)
- 当子类有和父类一模一样的函数,且子类调用该函数时,系统会执行子类函数的内容
- 子类重写父类,子类权限必须大于等于父类
静态只能覆盖静态
重载和重写的区别
- 重载:只看同名函数的参数列表
- 重写:子父类方法要相同(包括返回类型)
子父类的构造函数
- 子类的构造方法内部必须调用父类的构造方法,如果子类构造方法内部不写调用父类构造方法的代码时,系统会自动调用父类的默认构造方法。如果父类不存在默认构造方法时,则需手动使用super关键字进行调用
- super():访问父类的默认构造函数,且子类所有构造函数的第一行都默认super()。子类的构造函数默认第一行有一条隐式语句super()
子类的构造过程
- 首先构造父类的属性和方法(属性在方法前初始化)
- 其次构造子类的属性和方法(属性在方法前初始化)
2.3 super关键字
- 作用
- 在子类构造方法内部引用父类构造方法
- 在子类中调用父类的成员方法
- 在子类中调用父类的成员变量
- 非静态,不能再静态方法内部使用
2.4 final关键字
- 可以修饰类、变量、函数
- final修饰的类不可以继承
- final修饰的方法不可以复写
- final修饰的变量是常量,常量名大写
三、多态
3.1 多态说明
- 体现
- 父类的引用指向了自己的子类对象
- 父类的引用可以接收自己的子类对象
- 前提:必须是类与类之间有前提,要么继承,要么实现
- 好处:提高程序的扩展性
3.2 转型
- 向上转型:
Animal a = new Cat();
- 向下转型:
Cat c = (Cat)a; // 转的是父类引用
3.3 多态中成员的特点
- 成员函数:在多态调用时,编译看左边,运行看右边
- 成员变量:都参考左边(引用型变量所属的类),静态成员和函数都参考左边