面向对象的三大特征
封装 ,继承,多态
封装
隐藏实现细节,对外提供访问方式
1、封装方法:将代码封装成一个方法
2、封装属性:将属性使用,提供get,set方法
3、封装类:将属性和方法,封装在一个类中
好处:
提高安全性,提供复用性
javabean类的写法:
1、类名public
2、有无参构造器
3、将属性私有化(private)
4、有get()和set()方法
成员变量 | 局部变量 | |
---|---|---|
位置 | 类 | 方法 |
默认值 | 有 | 无 |
生命周期 | 随着对象的创建而创建,消失而消失 | 随着方法的调用而存在,方法的结束而消失 |
所在内存位置 | 堆 | 栈 |
当成员变量和局部变量重命名时
public void test(int a){
this.a = a;
}
this.a ----->成员变量
a ---------->局部变量
继承
减少了代码的冗余,提高代码复用性,便于功能的拓展,为之后多态性的使用提供了前提。
class A{}------>父类
class B extends A{}----->子类
特点
1:java是单继承 一个子类只能有一个父类
2:java是多层继承
3: Object 是所有类的父类 ,一个没有继承关系的类 会默认继承 Object
4:java中的继承 是一种 “假继承” “伪继承”;子类初始化之前 先完成父类的初始化。子类使用的内容 其实是父类对象的使用。
this 和 super 的关系
this 为当前的对象
super 为父类的对象
this() ,super() 获得对应的构造器
-->必须是代码的在所有的构造器中,不写的话 会默认调用父类的无参数构造super()
>>当子类和父类定义了同名的属性时
super.属性 可以调用父类父类声明的属性
>>子类重写了父类中的方法时
super.方法 调用的是父类中被重写的方法
多态
父类的引用指向子类的对象(将子类对象看成父类)。
Person p = new Man();
编译看左边,运行看右边。
**只适用于方法,属性的编译和运行都看左边。
class Person{}
class Man extends Person{}
前提
1、有继承或者实现关系
2、父类引用执行子类对象
多态中的方法调用问题:
1:如果多态产生 子类只能调用父类存在的方法
2:如果多态产生 ,父类有该方法 , 子类没有该方法 ,直接执行父类的方法
3:如果多态产生 父类有该方法 , 子类也有该方法 ,直接调用子类自身的方法
instanceof的使用:
用于避免向下转型时出现ClassCastException异常,判断为true才向下转型。
为什么向下转型?
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。使用向下转型才能调用子类特的属性和方法。
a instanceof A
判断a对象是否是类A的实例,如果是就返回true,否则返回false。
a所属类必须与类A是子父类关系,否则会编译错误