面向对象三大特征

封装

对象的属性不允许外部对象直接访问修改对象的内部信息,而是通过能被外界访问的方法来操作属性.对外封闭,对内开放.

继承

提高代码的重用

  • 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有.(不考虑反射机制)
  • 从内存的角度分析,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能无法访问使用. *
    从这个角度分析,子类对象只能继承父类非私有的属性及方法的说法是错误的
  • 子类可以对父类进行扩展,在父类基础上添加属性/方法.
  • 子类也可以重写父类方法

多态

对象具有多种的状态,具体子类,可以认为是其父类,也可以是其上层的接口.

  • 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定,编译时候仅检查是否存在.
  • 如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法。
  • 当涉及到多态的时候,往往关注的是向上转型/向下转型的问题 父类类型 变量名=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
    }
}
posted @ 2022-02-12 20:27  biglayman  阅读(58)  评论(0编辑  收藏  举报