面向对象

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

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

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

    • 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()
原文地址:https://www.cnblogs.com/haojia/p/12386241.html