zoukankan      html  css  js  c++  java
  • 面向对象

    一、面向对象基于面向过程

    • 什么是面向过程
      • 强调的是过程, 通过第一步, 第二步, 一步步自己完成对应的需求.
    • 什么是面向对象
      • 强调的是对象, 对象当中有具体的方法, 帮我们完成对应的功能.
    • 面向对象的思想特点
      • 面向对象是一种更符合我们思考问题的一种习惯(懒人思想)
      • 将复杂的问题简单化
      • 我们从执行者的位置变成了指挥者

    二、什么是类,什么是对象

      • java当中描述现实生活中事物都是通过类的形式.
      •  属性    就是事物的描述信息
      •  行为    就是事物能够做什么
    • 对象
      • 就是该类事物的具体体现
    • 怎么理解
      • 类仅仅是对事物的一种描述, 可以把类看做为一个模子,或者说是一张图纸
        对象则是具体存在的事物

    三、类和事物对应的关系

    事物           -------类
    事物的属性 -------类的成员变量
    事物的行为 -------类的成员方法
    成员变量和成员方法怎么在类中定义呢?
            成员变量: 跟之前定义变量的格式是一样的, 只不过位置发生了改变,在类中方外.
            成员方法: 跟之前定义方法的格式也是一样的, 只不过去掉了static关键字

    四、成员变量和局部变量的区别

    • 在类中的位置不同
      • 成员变量:类中,方法外
        局部变量:方法中或者方法声明上(形式参数)
    • 在内存中的位置不同
      • 成员变量:所属于对象,堆内存中
        局部变量:所属于方法,栈内存中
    • 生命周期不同
      • 成员变量:随着对象的创建而存在, 随着对象的消失而消失
        局部变量:随着方法的调用而存在, 随着方法的弹栈而消失.
    • 初始化值的问题
      • 成员变量:有默认值
        局部变量:没有默认值。必须先定义,赋值,最后使用
    • 作用域不同
      • 成员变量: 作用域在整个类当中
        局部变量: 只在它所在的那对儿大括号中有效

    五、面向对象三大特征

    1、封装

    隐藏实现细节, 仅对外暴露公共的访问方式.
    原则: 将不需要对外提供的内容都隐藏起来
    好处:
          提高了代码的安全性
          提高了代码的复用性

    private 可以看成是封装的一种体现

    private关键字 也是权限修饰符

               可以修饰的是成员(成员变量 成员方法)
              被其修饰的成员只能在本类中进行访问.

    2、继承

    • 继承让类与类产生关系,但是继承要符合现实规律
    • 继承的优缺点:
      •  优点:提高代码复用性,可维护性,把子类的共性属性和行为放在父类中,所有儿子自动拥有,不用在重复定义
      • 缺点: 写代码 要遵循 低耦合高内聚
                耦合:依赖别人的能力
                内聚:自己功能的能力
           
                依赖父类的能力变强:     父类一旦缺失某些属性和功能,子类不能再用
                自己的能力变弱:            我们把子类中一些功能和属性已经抽取到了父类中,子类直接拿过来用,不用自己定义
    • java中类继承的特点
      • 类与类属于单继承,但是可以多层继承  A extends B     B extends C
    • 继承中成员访问特点:
      • 成员变量访问:遵循就近原则,以 局部-->本类成员--->父类非私有成员 
      • 成员方法访问:遵循就近原则以 本类方法--->父类非私有方法---....->Object非私有成员
    • this与super
      • 子类的构造下第一行代码 是super()调用父类的构造方法        
                                     
         解释:子类初始化时候可能用到父类的数据,如果父类没有先初始化,子类就不能用这些数据,所以在子类初始化前,先完成父类的初始化
      • this
        • 可以调用本类的成员(成员变量/成员方法)
          哪个对象调用该成员方法,该成员方法中的this就代表这个对象        
        • this(参数)用来调用子类的构造方法
          语句必须放在构造方法第一行
              

          举例 : class Demo extends Demo2 {
          	 int a = 10;
          
          	public Demo() {
          
          		System.out.println("Demo构造方法无参");
          
          	}
          
          	public Demo(int a2) {
          		this();
          		System.out.println("Demo构造方法有参");
          	}
          
          }
          
           * 成员变量
           * 		this.成员变量名
           * 		super.成员变量名
           * 成员方法 
           * 		this.方法名(...)
           * 		super.方法名(...)
           * 构造方法 : 构造方法中使用
           * 		this(...)
           * 		super(...)
        • super

          • 可以调用父类的非私有成员(成员变量/成员方法)

          • super(参数);用来调用父类的构造方法,语句必须放在构造方法第一行

          • 如果第一行没有写super(实参)或this(实参)那么构造方法第一行一定有一个super();

    • 方法重写
      • .应用场景:当父类原有的功能不能完全满足我们需求,我们就考虑重写父类的功能,并且基于父类原有的功能提供更强的功能
      • 注意事项 :
        •   子类和父类的方法名,形参列表,返回值类型必须完全一致
        •   子类的方法的权限必须大于等于父类的方法的权限(不包含private)
                         public > protected > 默认权限(什么也不写) > private
        • 当子类的方法与父类的方法完全相同(方法名,形参列表,返回值类型全部相同),当创建子类对象 调用相同的方法,也是用的儿子的

    3、多态

    • 什么是多态 : 一个事物所具有的多种形态
    • 多态的前提 
      • 继承
      • 方法的重写
      • 父类的引用指向子类的对象
    • 多态中成员访问特点:
      • 成员变量
      •  编译时会检查父类中是否有该变量,如果没有,编译直接报错
         如果有,此时编译通过
         运行时,会执行父类的成员变量(编译看左边(父类 ) 运行看左边(父类))
      • 成员方法
        • 编译时会检查父类中是否有该成员方法,如果没有,编译直接报错
          如果有,此时编译通过
          运行时,会执行子类的的成员方法
      • 了解 : 
        • 静态成员:无论编译还是运行只看左边 ,(静态属于父类,没有从写这一说)
        • 方法有从写 所以编译看左边 运行看右边
    • 优点  : 多态提高了代码的复用性和扩展性
    • 缺点 : 不能直接访问子类特有功能,需要向下转型
    • 多态的向上转型与向下转型
      • 向上转型     把子类赋值给父类类型
      • 向下转型     向下转型
      • 向下转型需要强转
        //eg:
        public static void main(String[] args) {
        	      	Dog d =new Dog();
        	      	boolean result= d instanceof Dog;//d指向的对象是不是Dog的实例
        	      	System.out.println(result);
        	      	
        	      	Animal a=new Dog();
        	      	boolean result2= a instanceof Dog;//a指向的对象是不是Dog的实例
        	      	System.out.println(result2);
        	      	
        	      	Animal c=new Cat();
        	      	boolean result3= c instanceof Dog;//a指向的对象是不是Dog的实例
        	      	System.out.println(result3);
        }

    六、this关键字

    • this代表当前对象的引用, 谁来调用我, 我就代表谁.当前对象的引用
    • 作用 : 用于区分局部变量和成员变量的重名问题.
    • 如果局部变量和成员变量出现了同名的时候.    java采用的就近原则

    七、构造方法

    • 构造方法注意事项
      • 如果一个类中没有给出任何构造方法, 那么系统将会提供一个空参数的构造方法给我们使用
      • 如果手动给出了构造方法, 那么系统将不会再提供那个默认的空参构造了
      • 构造方法是系统帮我我们调用的,不能手动调用
    • 构造方法能够重载
      • 用来给对象中的属性进行初始化.
    • 给成员变量的两种初始化方式有什么区别?
      • 有参构造
      • 无参构造 +  setXxx()/getXxx()
  • 相关阅读:
    POJ 2585 Window Pains 拓扑排序
    hrbust 2069 萌萌哒十五酱的衣服~ stl
    CodeForces 785D Anton and School
    CodeForces 816C Karen and Game
    CodeForces 758C Unfair Poll 模拟
    CodeForces 746D Green and Black Tea 有坑
    CodeForces 811C Vladik and Memorable Trip dp
    栈 队列 (面向对象列表实现)
    员工信息表 信息检索(模糊查询)
    员工信息表 查询 周末写(很简单)
  • 原文地址:https://www.cnblogs.com/haojia/p/12386241.html
Copyright © 2011-2022 走看看