java基础学习——2 面向对象

16 篇文章 0 订阅
11 篇文章 0 订阅


大数据学习路线,从零开始学大数据(点击跳转,学习不迷路)

Java最详细教程 (点击跳转,学习不迷路)

面向对象【Java语言核心】

1、面向对象与面向过程

  • 面向过程和面向对象的区别:

           -面向过程:主要关注点是: 实现的具体过程,因果关系【集成显卡的开发思路】
               * 优点:对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低。
               
               * 缺点:采用面向过程的方式开发很难解决非常复杂的业务逻辑, 另外面向过程的
                       方式导致软件元素之间的 “ 耦合度 ” 非常高,只要其中一环出现问题,
                       整个系统受到影响,导致最终的软件 “ 扩展力 ” 差,另外,由于没有独立体的
                       概念,所以无法达到组件复用。
                       
           -面向对象:主要关注点是:主要关注对象【独立体】能完成哪些
                                   功能【独立显卡的开发思路】
                                   
               * 优点: 耦合度低,扩展力强。更容易解决现实世界中更复杂的业务逻辑,组件复用性强。
               
               * 缺点:前期投入成本较高,需要进行独立体的抽取,大量的系统分析与设计。
          
           -C语言是纯面向过程的、C++是半面向对象、Java是纯面向对象
           
           -目前出现的一些新的编程语言多数都是面向对象的,人在认识现实世界
           的时候以面向对象的方式。
           
           -面向对象更符合人的思维方式。 
    

2、 面向对象的三大特征【重点】:

       - 封装
       - 继承
       - 多态
       
         所有面向对象的编程语言都有者三大特征。 
         
         采用面向对象的方式开发一个软件,生命周期当中:【整个生命周期中贯穿使用OO面向对象方式】
             * 面向对象的分析:OOA
             * 面向对象的设计:OOD
             * 面向对象的编程:OOP

3、类和对象的概念

     *3.1 什么是类?
         - 类在现实世界中是不存在的, 是一个模板,是一个概念,是人类经过大脑思考抽象的结果    
         - 类代表了一类事物
         - 在现实世界中,对象a与对象b之间有相同的特征,进行抽象总结出一个模板,
           这个模板称做 “ 类 ”。
           
     * 3.2 什么是对象? 
         - 对象是实际存在的个体,现实世界当中实际存在。
           
     * 3.3 描述一下整个软件开发的过程:
         * 程序员先观察现实世界,从现实世界中寻找对象
         * 寻找了N个多对象之后,发现所有的对象都有共同特征
         * 程序员在脑海中形成了一个模板【类】
         * java程序员可以通过Java代码来表述一个类
         * Java程序中有了类的定义
         * 然后通过类可以创建对象
         * 有了对象之后,可以让对象直接协作起来形成一个系统。        
     
     * 类 -- 【实例化】-- >对象
     
     * 对象又被称为实例 / instance
     
     * 对象-- 【抽象】--> 类
     
     * 重点:
         类描述的是对象的共同特征。
         共同特征例如:身高特征
         这个身高在访问的时候,必须先创建对象,通过对象去访问这个特征。
         因为这个特征对应具体的某个对象上之后,值不同。有的对象1.80,有的对象身高1.70   
  
     * 3.4 一个类主要描述什么信息呢?
           一个类主要描述的是  状态 + 动作 。
           状态信息:名字、身高、性别、年龄
           动作信息:学习、吃饭、睡觉、跳舞
            
           状态--> 一个类的属性 
           动作--> 一个类的方法
      
    * 
       类{
              属性:// 描述对象的状态信息
              方法:// 描述对象的动作信息           
           }
       注意:状态和动作当具体到某个对象上之后,发现最终的结果可能不一样。

4、类的定义

  语法结构:
        [ 修饰符列表 ] class 类名{
                属性;
                方法;
          }

例如:

      学生类,描述所有学生对象的共同特征:
         学生对象有哪些状态信息:
           * 学号【int】
           * 名字【string】
           * 性别【boolean】
           * 年龄【int】         
            ......
     
         学生对象有哪些动作信息:
           * 吃饭
           * 睡觉
           * 学习
           * 玩
           * 唱歌
           * 跳舞
            ......

重点:属性通常是采用一个变量的形式来完成定义的

    int  no;
    int age;
    string name;
    string address;
    boolean sex;
  • 基本数据类型
    byte
    short
    int
    long
    float
    double
    boolean
    char

  • 引用数据类型
    String.class sun提供的
    System.class sun提供的

    Student.class 程序员自定义的
    User.class 程序员自定义的

  • java语言中所有的class都属于引用数据类型。

  • 对象创建的内存分配
    在这里插入图片描述

    访问实例变量的语法格式:
    读取数据:引用.变量名
    修改数据:引用.变量名 = 值

5、类的封装性

封装的好处:

在这里插入图片描述

封装的步骤:

在这里插入图片描述
在这里插入图片描述

6、构造函数(构造方法、构造器)

关于java类中的构造方法:

  1. 构造方法又称为构造函数 / 构造器 / Constructor

  2. 构造方法语法结构:
    [ 修饰符列表 ] 构造方法名(形参列表){
    构造方法体;
    }

  3. 回顾普通方法的语法结构:
    [ 修饰符列表 ] 返回值类型 方法名(形参列表){
    方法体;
    }

  4. 对于构造方法来说,“返回值类型”不需要指定,并且也不能写void,
    只要写上void,那这个方法就变成普通方法了。

  5. 对于构造方法来说,构造方法名一定要与类名保持一致。

  6. 构造方法的作用?
    构造方法的意义是,通过构造方法的调用,可以创键对象。

  7. 构造方法怎么调用的?

    • 普通方法是这样调用的:
      方法修饰符中有static的时候: 类名.方法名(实参列表)
      方法修饰符中没有static的时候: 引用.方法名(实参列表)
    • 构造方法怎么调用:
      new 构造方法体(实参列表)
  8. 构造方法调用执行之后,有返回值吗?
    每一个构造方法调用执行之后都有返回值,但是这个 “ return 值;” 这样的语句不用写。构造方法结束的时候自动返回值 。
    并且返回值类型是构造方法所在类的类型。由于构造方法的返回值就是类本身,所以返回值类型不需要写。

  9. 当一个类中没有定义任何构造方法,系统默认会给改类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。

  10. 当一个类显示的构造方法定义出来了,那么系统则不再默认为这个类提供省构造器。建议开发过程中手动的为当前类提供无参数构造方法。因为无参数的构造方法太常用了。

  11. 构造方法支持重载机制。在一个类当中编写多个构造方法,这多个构造方法显然已经构成方法重载机制。

构造方法的作用:

  1. 创建对象
  2. 创建对象的同时,初始化实例变量的内存空间。

7、对象和引用:

7.1 对象和引用的概念?

       * 对象:目前在使用new运算符在堆内存中开辟的内存空间称为对象。
       * 引用:是一个变量,不一定是局部变量,还可能是成员变量。引用保存了内存地址,指向了堆内存的对象
       * 所有访问实例相关的数据,都需要通过 “ 引用. ” 的方式访问,因为只有通过引用才能找到对象。
       * 只有一个空的引用,访问对象的实例相关的数据会出现空指针异常。
     class Student{
             Computer  com ; // com是一个引用【实例变量】
        
             public static void dosome(){
                     Computer cc ;    // cc是一个引用【局部变量】
             }
     }

7.2 参数的传递?

在这里插入图片描述

传递值:

在这里插入图片描述
方法调用的时候,涉及到参数传递的问题,传递的时候,Java只遵循一种语法机制,
就是将变量中保存的 “ 值 ” 传递过去了,只不过有的时候这个值是一个字面值,有的时候
这个值是另一个java对象的内存地址ox1234

传递对象的地址:
在这里插入图片描述

8、this关键字:

  1. this 是一个关键字,翻译为:这个
  2. this是一个引用,this是一个变量,this变量中保存了地址指向了自身。this存储在Jvm堆内存Java对象内部
  3. 创建100个Java对象,每一个对象都有this。也就是说100个有不同的this。
  4. this可以出现在 “ 实例方法 ” 当中,this指向当前正在执行这个动作的对象。(this表示当前对象)
  5. this在多数情况下都是可以省略不写的。
  6. this不能使用在带有static的方法当中。

在这里插入图片描述

在这里插入图片描述

 在带有static的方法中不能 “ 直接 ” 访问实例变量和实例方法。
 因为实例变量和实例方法都需要有对象的存在。
 而static的方法当中是没有this的,也就是说当前对象是不存在的。
 自然无法访问当前对象的实例变量和实例方法。                   

在这里插入图片描述

“ this. ”什么时候不能省略?

用来区分局部变量和实例变量的时候,“ this. ”不能省略。

在这里插入图片描述
在这里插入图片描述
this可以用在哪里:

  1. 可以用在实例方法当中,代表当前对象【语法格式:this.】
  2. 可以使用在构造方法当中,通过当前的构造方法调用其他的构造方法【语法格式:this(实参);】

重点【记忆】:this()这种语法只能出现在构造方法的第一行。

8、static 关键字

  • 什么时候成员变量声明为实例变量呢?

       所有对象都有这个属性,但是这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同。】
    
  • 什么时候成员变量声明成静态变量呢?

       所有对象都有这个属性,并且所有对象这个属性的值都是一样的,建议定义为静态变量,节省内存的开销。
    

静态变量在类加载的时候初始化,内存在方法区中开辟。访问的时候不需要创建对象,直接使用“类名.静态变量名”的方式访问。

关于Java关键字中static语句:

  1. static英语单词翻译成静态的
  2. static修饰的方法是静态方法
  3. static修饰的变量称为静态变量
  4. 所有static修饰的元素都称为静态的,都可以使用“类名.”的方式访问,当然也可以用“ 引用. ” 的方式访问【但不建议】
  5. static修饰的所有元素都是类级别的特征,和具体的对象无关。

可以使用static关键字来定义 “ 静态代码块 ” :

  1. 语法格式:
    static{
    Java语句;
    }
  2. 静态代码块在类加载时执行,且只执行一次。
  3. 静态代码块在类中可以编写多个,并且遵循自上而下的顺序依次执行。
  4. 静态代码块的作用是什么?怎么用?用在哪?什么时候用?
    - 这和具体的需求有关,例如项目中要求在类加载的时刻 / 时机执行代码完成日志的记录。
    那么这段记录的代码就可以编写到静态代码块当中,完成日志记录。
    - 静态代码块是java为程序员准备一个特殊的时刻,这个特殊的时刻被称为类加载时刻。
    若希望在此刻执行一段特殊的程序,这段程序可以直接放到静态代码块当中。
  5. 通常在静态代码块当中完成预备工作,先完成数据的准备工具,例如:初始化连接池,解析XML配置文件…

实例代码块:

在这里插入图片描述
在这里插入图片描述
一个类中可以有这些:

在这里插入图片描述

9、类的继承

  • Java语言当中的继承
  1. 继承是面向对象的三大特征之一,分别是:封装、继承、多态。

  2. 继承“基本”作用是:代码复用。但是继承最“重要”的作用是:有了继承才有了以后“方法的覆盖”和“多态机制”。

  3. 继承语法格式:
    [修饰符列表] class 类名 extends 父类名{
    类体 = 属性 + 方法
    }

  4. Java语言当中的继承只支持单继承,一个类不能同时继承多个类,只能继承一个类。

  5. 关于继承的一些术语:
    B类继承A类,其中:
    A类称为:父类、基类、超类、superclass
    B类称为:子类、派生类、subclass

  6. 在Java语言当中子类继承父类都继承哪些数据?
    * 私有的不支持继承
    * 构造方法不支持继承
    * 其他数据都可以被继承

  7. 虽然Java语言当中只支持单继承,但一个类也可以间接继承其他类,例如:
    C extends B {
    }
    B extends A {
    }
    A extends T{
    }
    C类继承B类,但是C类间接继承 T 、A 类。

  8. Java语言中假设一个类没有显示的继承任何类,该类默认继承JavaSE库当中提供的java.lang.Object类。

10、方法的覆盖

  • 回顾Java语言当中方法的重载:

    1. 方法重载又称 :Overload

    2. 方法重载什么时候使用?
      当在同一个类当中,方法完成的功能是相似的,建议方法名相同,这样方便程序员的编程。
      就像在调用一个方法似的,代码美观。

    3. 什么条件满足之后构成方法的重载?
      * 在同一个类中
      * 方法名相同
      * 参数列表不同:类型、顺序、个数

    4. 方法重载和什么无关?
      * 和方法的返回值类型无关
      * 和方法的修饰符列表无关

  • 关于Java语言中方法的覆盖:

    1. 方法覆盖又被称为方法重写:override 【官方的】/ overwrite

    2. 什么时候使用方法重写?
      * 当父类的方法已经无法满足当前子类的业务需求。
      * 子类有必将父类继承过来的方法进行重新编写

    3. 什么条件满足之后发生方法重写?【代码满足什么条件之后,就构成方法的覆盖呢?】

      • 方法重写是发生在具有继承关系的父子类之间
      • 方法重写的时候:返回值类型相同、方法名相同、形参列表相同
      • 方法重写的时候:访问权限不能更低,可以更高。
      • 方法重写的时候:抛出异常不能更多,可以更少。
    4. 建议方法重写的时候尽量复制粘贴。 不要编写,容易出错,导致,没有产生覆盖。

    5. 私有方法不能继承,所以不能覆盖
      构造方法不能继承,所以不能覆盖
      静态方法不存在覆盖。
      覆盖只针对方法,不谈属性。

11、多态

多态的基础语法:

在这里插入图片描述
使用多态语法机制:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
向下兼容转型:
在这里插入图片描述

  • 当两个子类之间进行强制转换时,由于两个子类不存在继承关系,会出现著名的异常:java.lang.ClassCastException
  • 类型转换异常, 这种异常总是在“向下转型”的时候会发生

向下转型:
Animal a3 = new bird();
cat c3 = (cat)a3;

    1. 以上异常只有在强制类型转换时才会发生,也就是“向下转型”存在隐患(编译过了,但是运行错了!)
	2. 向下转型只要编译通过,运行一定不会出现问题: Animal a = new Cat()
	3. 向下转型编译通过,运行可能出现错误: Animal  a3 = new Bird();  Cat c3 = (Cat)a3;
	4. 怎么避免向下转型出现ClassCaseEception呢?
	          使用instanceof(实例) 运算符可以避免以上的异常。
	5. instanceof运算符怎么使用呢?
	             5.1、语法格式 :
	                   (引用 instanceof 数据类型名)
	             5.2、以上运算符的执行结果类型是布尔类型,结果可能是true / false
	             5.3、关于运算结果true/ false:
	                     假设:(a instanceof Animal)
	                           true表示:
	                                  a这个引用指向的对象是一个Animal类型。
	                           false表示:
	                                   a这个引用指向的对象不是一个Animal类型。
          if(a3 instanceof Cat) {
                  Cat  c3 = (Cat)a3; 
            }else if (a3 instanceof Bird ){
                   Bird b2 = (Bird)b3;
            }
  1. java规范中要求:在进行强制类型转换前,建议采用instanceof运算符进行判断,避免ClassCastException异常的发生

多态在实际开发过程中的作用:
以主人喂养宠物为例说明多态的作用:

  1. 分析:主人喂养宠物这场景实现需要进行类型的抽象:
    - 主人【类】
    - 主人可以喂养宠物,所以主人又喂养的动作
    - 宠物【类】
    - 宠物可以吃东西,所以宠物有吃东西的这个动作

  2. 面向对象编程的核心:定义好类,然后将类实例化成对象,给个环境驱使一下,让各个之间协作成一个系统。

3.多态的作用是什么?

   降低程序的耦合度,提高程序的扩展力。
  能使用多态尽量使用多态
  父类型引用指向子类型对象

核心:面向抽象编程,不要面向具体编程。

11、final关键字

关于Java语言当中的final关键字:

 1. final是一个关键字,表示:最终的,不可改变的
 2. final修饰的类无法被继承
 3. final修饰的方法无法被覆盖
 4. final修饰的变量一旦赋值之后,不可重新赋值
 5. final修饰的实例变量,必须手动赋值,不能采用系统默认赋值
 6. final修饰的引用,一旦指向某个对象之后,不能再指向其他对象,那么被指向的对象无法被垃圾回收器回收。
        final修饰的引用虽然指向某个对象之后不能在指向其他对象,但是所指向的对象内部的内存也是可以被修改的。
 7. final修饰的实例变量,一般和static联合使用,被称为常量。 

在这里插入图片描述
对于以后学习的类库,一般是包括三个部分:
- 源码【可以看源码来理解程序】
- 字节码【程序开发过程中使用的就是这部分】
- 帮助文档【对源码的解释说明被提取出来,更方便程序的开发】

注意使用的时候版本统一。

12、package

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13、访问控制权限

  • 访问控制权限修饰符:

     1. 访问控制权限修饰符来控制元素的访问范围
     
     2. 访问控制权限符包括:
               public         表示公开的,在任何位置都能访问
               protected      同包、同类下可以访问
               缺省           同包下可以访问
               private        表示私有的,只能在本类访问
               
     3.  访问控制权限符可以修饰类、变量、方法......
     
     4.  当某个数据只希望子类使用,使用protected进行修饰。
     
     5. 修饰符的范围:
              private < 缺省 < protected < public 
    

14、super关键字

1、super的使用

在这里插入图片描述

2、super关键字与this关键字的对比:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3、什么情况下不能省略super关键字?

在这里插入图片描述

  • super不是引用,也不保存内存地址,super也不指向任何对象。
  • super只是代表当前对象内部的那一块父类型的特征。
  • this和super都不能用在静态方法static当中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海码儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值