1、什么是封装

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

封装的步骤:
    1)修改属性的可见性
        改为private(防止错误修改属性值)
    2)创建公有的(public)getter和setter方法
        方便对私有的属性进行赋值和读取
    3)在getter和setter方法内,增加属性控制逻辑语句
        对属性赋值或者读取进行合法的判断处理

封装的好处: 
    隐藏实现细节,方便修改
    便于使用者正确使用系统,防止错误修改属性
    有助于系统之间的松耦合,提高系统独立性
    提高软件的可重用性
    降低了构建大型系统的风险

2、访问权限控制

类的访问权限控制
    public修饰符:公有访问级别
    默认修饰符:包级私有访问级别
        不同包,使用默认修饰符修饰的类,不可以跨包使用

访问修饰符
    四个关键字:private,默认(default,friendly),protected,public
    访问权限范围从小到大,即安全性从高到低

    访问修饰符   同类       同包      子类(不同包)     其它
    private     V          X        X              X
        除了类内,其它都不可以访问,子类不可以继承
    默认修饰符    V          V        X              X
        包访问权限,即在同一个包内都是可以访问的
    protected   V          V        V              X
        在同类,同包都可以访问,继承的子类也可以访问
    public      V          V        V              V
        对任何对象都是可访问的

3、static关键字

一句话描述:
    方便在没有创建任何对象的前提下,可以直接通过类进行访问(属性或者方法)
		static可以修饰成员属性和成员方法,还可以单独存在,即static代码块

注意:
    static代码块,可以出现在类的任何地方,类内可以有多个static代码块
    static代码块,在类加载的时候,会按照static块的先后顺序进行执行,且只会执行一次。

类变量(static修饰的成员变量)和实例变量的区别
    1)被static修饰的变量,在内存中只有一个拷贝,类内部,可在任何方法内直接访问静态变量,其他类中,可以直接通过类名访问
    2)没有被static修饰的变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。

类方法(static修饰的成员方法)和实例方法的区别
    1)静态方法中不能使用this和super,不能直接访问所属类的实例变量和实例方法,可直接访问类的静态变量和静态方法
    2)可直接访问所属类的静态变量、静态方法、实例变量和实例方法

    归纳:非静态方法可以访问静态属性和方法,但是反过来不成立

4、继承的用法

语法:
    编写父类
        [访问修饰符] class Pet { 
            //公共的属性和方法
        }

    编写子类
        [访问修饰符] class Dog extends Pet { 
            //子类特有的属性和方法
        }

    注意:
        子类和父类要存在is-a的关系
        使用的继承关键字为:extens,类和类之间只能存在单继承,即只能继承一个类,同一个类可以被多个子类继承

访问父类的成员:
    关键字:super,代表父类的对象
    子类访问父类的构造:
        super()或者super(参数)
    子类访问父类的属性:
        super.属性
    子类访问父类的方法:
        super.方法()

    注意:
        1)super关键字只能出现在存在继承关系的子类中,且只能在方法或者构造方法中
        2)在子类构造方法中,super关键字调用父类的构造,只能在第一句
        3)不可以通过super关键字访问父类的private属性或者方法

继承条件下,子类继承规则:
    子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法
        系统默认调用父类的无参构造方法
    
    子类构造方法通过super显式调用父类的有参构造方法
        执行父类相应构造方法,而不执行父类无参构造方法

5、子类可以继承父类的内容

1)继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
2)继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里

父类不可以被子类继承的内容:
    1)父类的私有成员(属性和方法)-- private修饰的
    2)子类和父类不在同包下面,父类使用默认修饰符修饰的成员
    3)子类不能继承父类的构造方法(构造是跟类紧密关联的,方法名不同,有特殊用法,用户创建实例)

6、何时使用继承:

1)是否存在is-a的关系,存在就可以用
2)继承的使用条件
    子类是特殊的类型,不代表是父类的角色
    子类是父类的扩展,可以包含子类特有的属性和方法,且不能让父类的功能失效