面向对象三大特征
封装
对象的属性不允许外部对象直接访问修改对象的内部信息,而是通过能被外界访问的方法来操作属性.对外封闭,对内开放.
继承
提高代码的重用
- 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有.(不考虑反射机制)
- 从内存的角度分析,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能无法访问使用. *
从这个角度分析,子类对象只能继承父类非私有的属性及方法的说法是错误的
- 子类可以对父类进行扩展,在父类基础上添加属性/方法.
- 子类也可以重写父类方法
多态
对象具有多种的状态,具体子类,可以认为是其父类,也可以是其上层的接口.
- 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定,编译时候仅检查是否存在.
- 如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法。
- 当涉及到多态的时候,往往关注的是向上转型/向下转型的问题
父类类型 变量名=new 子类类型();
子类类型 变量名=(子类类型) 父类类型的变量;
,一般向下转型为了安全会使用instanceof关键词作为判断,以免转换异常,话说,你都能向下转型,肯定就知道能转呀,hhh - 多态成员变量 编译运行都看左边
- 多态成员方法 编译看左边运行看右边
当然也可以这么理解: - 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找
- 间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找
public class Code24_Demo {
public String a="father";
public void say(){
System.out.println("father");
}
}
class B extends Code24_Demo{
public String a="son";
public void say(){
System.out.println("son");
}
public static void main(String[] args) {
Code24_Demo obj=new B();
System.out.println(obj.a);//father
obj.say();//son
}
}