一、封装
概念:隐藏程序内部的具体实现细节,对外提供接口,从而提高程序的安全性。
高内聚,低耦合。
使用封装的步骤:
1、属性私有化,使用private访问修饰符进行修饰
2、对外提供 setter/getter 方法 setter设置值 getter获取值
3、在setter语句中进行逻辑语句进行判断
访问修饰符的使用
public 公共的
protected 受包保护的
默认修饰符 默认访问修饰符,不可显示定义
private 私有的只有本类可以访问
二、继承
2.1 Object类:
所有类的基类。(父类)
Java是单根继承,子类只有一个直接父类。但Java有传承性。子类可以有多个间接父类。
2.2 使用继承后,子类不能继承父类的那些成员:
private私有化的
构造方法(只能调用,不可继承)
不同包中的,默认访问修饰符修饰的成员。(protected、public修饰的可以)
//static 静态使用
//被包保护的静态常量
//数据共享时 static 静态
//当数据不经常更改时 final 常量
//当数据既是共享的也不易于更改时 static final 静态常量
protected static final String GIRL = "雌";
protected static final String BOY = "雄";
2.3 继承的优缺点
优点: 提高代码的复用性
提高代码的维护性(一改即可改全部)
让类与类之间产生了关系,是多态的前提
缺点: 类的耦合性增强
开发的原则:高内聚低耦合
耦合:类与类的关系
内聚:自己处理某件事情的能力
关键字 extends
目的:减少代码量,方便后期维护修改。
符合继承的关系: is a
使用步骤: 将多个程序类中的共同的特征抽取出来,形成一个公共的类。这个公共的类叫父类,实现继承这个公共的父类的程序,叫做子类。
继承的语法:
访问修饰符 子类 extends 父类{ //成员变量 //成员方法 }
子类继承父类后构造的执行顺序:先父类后子类
当子类构造没有显示调用父类任意构造时,系统会隐式默认调用父类无参构造方法。
当子类构造显示调用了父类任意构造时,系统就不会隐式默认调用父类无参构造方法。
此时程序执行时,只会调用子类构造调用的对应父类构造方法,且该类调用的构造方法必须放在首行
2.4 代码示例
让类与类之间产生关系,子父类关系
例如 狗类猫类都属于动物类
Animal 是父类
Dog Cat 是子类
public
2.5 继承的特点
只支持单继承(一个儿子继承一个父亲)
不支持多继承(有些语言支持多继承,格式:extends 类1,类2)
Java支持多层继承(继承体系,儿子继承父亲,父亲继承爷爷)
如果想用这个体系的所有功能中
即DemoC多层继承了DemoB和DemoC 用最底层的类创建对象
如果想看这个体系的共性功能
即DemoB和DemoC 都从DemoA继承 看最顶层的类
2.6 继承的注意事项
继承是 is a 的关系
学生 老师 是 人
苹果 西瓜 是 水果
狗 猫 是 动物
如果有A、B两个类 若A是B的一种,或B是A的一种就可以考虑使用继承。
2.7 继承中成员变量的关系
子父类不同名变量,没有影响
子父类同名变量(开发中不允许出现这种情况,子类继承父类就是为了使用父类的成员,
自己再定义同名的成员变量就失去了继承的意义),
就近原则,即子类自己有就不用父类的
2.8 this与super的区别
2.9 继承中构造方法的关系
构造方法:进行初始化
因为子类初始化之前要先完成父类的初始化
子类中所有的构造方法都会默认访问父类中空参数的构造方法
父类初始化完成后才轮到子类
2.10 构造方法的注意事项
this与super不能同时出现
当父类没有无参构造方法时
使用setXxx( ) getXxx( )方法
2.11 继承中成员方法的关系
不同名的方法名
直接使用
同名的方法名
若想使用父类的方法 使用 super. 调用
方法重写
2.12 static关键字的使用
被static修饰的变量叫做静态变量或类变量
被static修饰的方法叫做静态方法或类方法
被static修饰的代码块叫做静态代码块
被static修饰的成员,直接通过 类名.成员(属性、方法);
static的使用场景:
数据共享时 static 静态
当数据不经常更改时 final 常量
当数据既是共享的也不易于更改时 static final 静态常量
静态修饰的成员和非静态修饰成员的区别:
非静态(实例) 成员变量和成员方法 可以是静态也可以是非静态
注意: 实例方法和静态方法可以直接调用static 但不可定义static 因为static称为类变量
只能在类中定义
静态只能访问静态
静态方法不能【直接】调用非静态(实例)成员
2.13 类变量(静态变量)和实例变量(对象变量,成员变量)的区别?
(1)所属不同:类变量属于类,是对象的共性内容;实例变量属于对象,是对象的特性内容。
(2)在内存中位置不同:类变量存在方法区的静态区,拷贝只有一份;实例变量存在堆内存中,拷贝可以有一份或者多份。
(3)生命周期不同:类变量随着类的加载而存在,随着类的消失而消失;实例变量随着对象的存在而存在,随着对象的消失而消失。
(4)调用方式不同:类变量既能被类名点的形式调用,也能通过对象点的形式调用;而实例变量只能通过对象点的形式调用。通过实例化对象名. 实例化变量 操作。
2.14 abstract
abstract修饰的类为抽象类 不能被实例化
抽象类中可以定义0~多个抽象方法
继承抽象类的子类,该子类必须重写父类中的所有抽象方法,除非该子类也是一个抽象类。
抽象方法必须存在于在抽象类中
abstract修饰的方法为抽象方法 没有方法体
抽象类的使用场景:
父类没有必要实现方法的具体细节
父类强制要求子类必须实现的功能方法
2.15 方法重写
可理解为子类重写父类方法
前提:存在继承关系
概念:不同类中,方法名相同。参数列表相同。
子类的访问修饰符不能严于父类
子类的方法返回值类型和父类的返回值类型相同,或者是其子类。
简写:不同类,同名,同参,与方法返回值类型和返回修饰符有关。
子类重写父类的常见方法:
toString();
equals();
2.16 方法重载
简写:同类,同名,不同参,与方法返回值类型和返回修饰符无关。
2.17 代码块的执行顺序
静态代码块只执行一次
构造代码块优先于构造方法
先有父类再有子类 即使用子类构造方法前要先进行父类构造方法
public class Text01 { public static void main(String[] args) { Zi z = new Zi(); } } class Fu { static { System.out.println("Fu静态代码块"); }
{ System.out.println("Fu构造代码块"); } public Fu() { System.out.println("Fu构造方法"); }
}
class Zi extends Fu { static { System.out.println("Fu静态代码块"); }
{ System.out.println("Zi构造代码块"); } public Zi() { System.out.println("Zi构造方法"); } }