访问修饰符🚩
- java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围)
- 公开级别:用public修饰,对外公开
- 受保护级别:用protected修饰,对子类和同一个包中的类公开
- 默认级别:没有访问修饰符号,向同一个包的类公开
- 私有级别:用private修饰,只有类本身可以访问,不对外公开
- 注意事项和使用细节
- 修饰符可以用来修饰类中的属性、成员方法和类、
- 成员方法的访问规则和属性完全一样
- 只有默认和public才能修饰一个类,并且遵循上述访问权限
封装🚩
面向对象编程(object-oriented programming, OOP)的三大特点:封装、继承和多态
封装(encapsulation)就是把“抽象出的数据”(属性)和“对数据的操作”(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过“被授权的操作”(方法),才能对数据进行操作
- 优点
- 隐藏实现细节,仅对外提供操作接口即可
- 可以对数据进行验证,保证安全 合理
- 封装的实现步骤
- **将属性进行私有化 **private(外部不能直接修改属性)
- 提供一个公共的(public)set方法,用于对属性判断并赋值
public void setXxx(类型 参数名)
{
//加入数据验证的业务逻辑
属性 = 参数名;
}
- 提供一个公共的(public) get方法,用于获取属性的值
public XX getXxx()
{
//权限判断
return xx;
}
- 当使用构造器时,直接赋值会绕过set方法中的数据验证,可以使用定义的public的set方法来赋值
public Person(String name, int age, double salary)
{
setName(name);
setAge(age);
setSalary(salary);
}
继承🚩
- 继承可以解决代码复用。当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类则不需要再重新定义,只需通过extends来声明继承父类即可。
- 语法
class 子类 extends 父类{}
- 子类会自动拥有父类定义的属性和方法(不包括父类private的属性和方法)
- 父类又叫超类、基类
- 子类又叫派生类
- 注意事项和使用细节
-
子类继承了所有的属性和方法,但是私有属性和方法不能直接在子类中访问,要通过公共的方法访问
-
子类默认(一定会)调用父类的构造器,完成父类的初始化
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,即子类构造器默认会执行super(),不管你是否显示调用super()。如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个有参构造器完成对父类的初始化工作,否则,编译不通过
-
如果希望去调用父类的某个构造器,则使用super显式地调用
-
super在使用时,只能放在构造器的第一行
-
super()和this()都只能放在构造器的第一行,因此这两个方法不能共存于同一个构造器
-
java的所有类都是Object类的子类
-
父类构造器的调用不限于直属父类,将一直向上追溯直到Object类(顶级父类)
-
子类最多只能继承一个父类(指直接继承),即java中是单继承机制,如果想同时继承A和B,只能是B继承A,C再继承B,这样C就能同时继承A和B(间接的方式实现要求)
-
不能滥用继承,子类和父类之间必须满足is-a的逻辑关系。
比如:Cat is a Animal; //cat可以继承animal类
Person is not a Music;//Person并不是一个音乐,不符合继承的逻辑
-
继承的本质
当子类对象创建好后,建立查找的关系
-
查找子类属性的流程—在堆区查找
-
首先看子类是否有该属性
-
如果子类有该属性,并且可以访问,则返回信息
-
如果子类没有该属性,就查看父类有没有该属性
-
父类如果有该属性,并且可以访问,就返回信息
-
如果父类没有,就按照相同的规则继续查找上级父类,直到Object
但是 如果父类有但是无权访问,就会报错,不会继续向上查找了
-
-
查找方法的流程----在方法区的类加载信息查找,类似属性的查找规则
super
- 基本语法
- 访问父类的属性(除private外),语法:super.属性名;
- 访问父类的方法(除private外),语法:super.方法名(参数列表);
- 访问父类的构造器,只能放在构造器的第一句,语法:super(参数列表);
- 好处
-
调用父类构造器:分工明确,父类属性由父类初始化,子类属性由子类初始化
-
当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问效果是一样的。
本质是因为this和直接访问是从本类开始查找,而super是从直接父类开始找。
- 使用细节和注意事项
- super的访问不限于直接父类,如果多个父类有同名的成员,使用super遵循就近原则
- super和this的比较