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)继承的使用条件
子类是特殊的类型,不代表是父类的角色
子类是父类的扩展,可以包含子类特有的属性和方法,且不能让父类的功能失效