Java 面向对象基础和进阶

3-2 面向对象基础

面向对象概述

课堂笔记
  • 面向对象是一种编程思想,是相对于面向过程的概念而言的。
  • 面向对象强调把数据和方法组织成一个整体来看待,将世间万物抽象成一个个对象来对待。
  • 面向对象与面向过程的区别:
    • 两者关注点不一样,前者关注的是具备功能的对象,后者关注执行过程。
    • 从过程到对象,程序员是从执行者向指挥者的转变。
  • 大象装进冰箱的例子:
    • 面向过程:逐步分解,代码按执行过程来编写。
    • 面向对象:先招一个工人,即构建一个能装大象的对象,指挥工人执行装大象即可。
  • 面向对象三大思想:
    • OOA:面向对象分析(Object Oriented Analysis)
    • OOD:面向对象设计(Object Oriented Design)
    • OOP:面向对象程序(Object Oriented Programming)
  • 面向对象三大特征:
    • 封装性:所有的内容对外部不可见
    • 继承性:将其他的功能继承下来继续发展
    • 多态性:方法的重载本身就是一个多态性的体现
知识拓展
  • 当问题变得复杂时,若设计程序时,按面向过程的思路来设计,则需要考虑多个过程该如果执行,逐个执行各个过程。系统越庞大,则组织起来越麻烦。而使用面向对象的思想来设计程序,则只需要去抽象出各个对象,将相关数据和方法进行组织,而程序员只需要在抽象对象后关注少量的统筹架构问题即可。
  • 汇编语言和C语言一般是就面向过程的编程思想来设计程序的,但也有特殊情况,例如使用C语言编写的linux系统中就有大量的面向对象的编程思想,其主要利用C语言中的结构体+函数指针等方式实现数据和方法的组织。

类与对象的关系

课堂笔记
  • 类表示一个共性的概念,而对象是基于某个类来生成的实例,类知识图纸,无法直接用来使用,而按图纸实现的产物才能用来直接使用。

  • 类由属性和方法组成:

    • 属性:是一个个抽象出来的特性
    • 方法:是一个个具体的行为,是该类的对象具备的行为。
  • 类的定义格式

    /*
    * 1、类必须编写在.java文件中
    * 2、每个.java文件可以有多个类,但是只存在一个public修饰的类
    * 3、在同一个包中,类名不能重复
    * 4、.java文件名称必须与public修饰的类名称完全一致
    */
    public class 类名称{
        成员属性
        成员方法
    }
    /*
    * 方法在定义时的参数列表成为形式参数列表
    * 在使用方法时传入的参数列表称为实际的参数列表
    */
    
  • 对象的创建和使用

    • 通过引用数据类型进行操作:类名称 对象名称 = new 类名称() ;
    • 访问类中的属性: 对象.属性 ;
    • 调用类中的方法: 对象.方法(实际参数列表) ;
  • 方法定义无返回值时(类型为void),也可以在方法中使用return提前结束方法。

对象创建内存

课堂笔记
  • 使用等号=进行同类对象间的赋值时,实际上是引用名称的指向赋值,而非内存的赋值。
  • Java内存使用区域分类:栈、堆、方法区、PC寄存器(JVM指令)、本地方法栈。
  • 栈本身的特点是:数据先进后出,且使用指针移动来存储和释放数据。
    • 栈里存放了对象名称和基本数据类型的值。
    • 一个线程使用一个栈区。
    • 栈操作速度仅次于PC寄存器。
    • 栈需要预先确认了范围,不够灵活。而堆中可以根据实际需求而开辟内存。
  • JAVA对象存放在堆中,其开辟的内存空间根据实际需求而定。
  • PC寄存器:存放的是当前正在执行的JVM指令的地址。每个线程启动时都会创建一个PC寄存器。
  • 本地方法栈:保存本地(native)方法的地址。
  • 方法区:
    • 存放的是类信息、静态的变量、常量、成员方法
    • 方法区中包含了一个特殊的区域 ( 常量池 )(存储的是使用static修饰的成员)
知识拓展
  • 一个对象从类的创建到对象实例化的过程:

    • 先将构造的类放在方法区。
    • 创建对象堆内存并将指针给到栈中的引用值。
    • 在栈中的对象引用值指向的是该对象在堆中的地址。
    • 调用对象的方法时,先去方法区找到方法,若方法中使用了属性,则根据栈中的指针指向的堆内存中取出相应的数据。
    • 当在堆中的对象数据没有对应的栈中指针指向时,GC机制会在合适的时机自动将其清除。
  • 只要理解了C/C++语言中的指针概念和其高级用法, 弄清楚深拷贝和浅拷贝的区别,理解JAVA部分的内存分配不成问题。

构造方法

课堂笔记
  • 构造方法本质也是类的一个方法,若不自定义,则编译器自动生成一个无参的构造方法。
    • 这里建议编写类时为每个类编写无参和全参的两种构造方法。
    • 自定义无参构造方法是为了避免依赖编译器,避免错误发生。
    • 自定义全参构造方法是为了在创建对象实例时直接传入全参从而构造该对象。
    • 特殊处理:当类中所有成员变量都是常量或者没有成员变量时,建议不提供任何版本的构造。
  • 构造方法的作用是初始化对象,在创建对象时自动调用。
  • 该方法区别于普通的方法,其方法名称必须与类名称相同,且没有类型的声明。
知识拓展
  • 构造方法仍然保留了C++语言的影子,可以对比二者的区别,几乎一样。
  • 但是C++中还必须有析构方法,而JAVA中没有。

方法的重载

课堂笔记
  • 应用场景:需要相同名称不是同一个方法的方法。

  • 方法的重载与返回值无关!!!,只与参数列表中的类型顺序长度有关,不与形参名称的顺序。

  • 方法的重载 ,可以让我们在不同的需求下, 通过传递不同的参数调用方法来完成具体的功能。

  • 构造方法的重载:

    • 以为构造方法也是方法,故也可以重载。
    • 重载后可以根据不同的应用场景中,在创建对象时根据实参类型的顺序来选择不同的构造方法来进行初始化。

匿名对象

课堂笔记
  • 没有对象名称的对象 就是匿名对象。
  • 匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被GC回收。
  • 只使用一次的对象可以通过匿名对象的方式完成,这一点在以后的开发中将经常使用到。

阿里巴巴编程规范

课堂笔记
  • 除Java编译器规定的规则外,阿里巴巴自己定义的规范。

  • 可以使用阿里巴巴规范插件在编辑器中强制提示按规范编写代码。

  • 命名风格:

    • 命名符号:不能以下划线或美元符号开始
    • 不能用中英文混合
    • 类名UpperCameClass,其他统一使用lowerCameCLass
    • 常量命令全部大写且下划线隔开,并力求完整。
  • 代码格式:

    • 大括号约定,采用左括号对齐的方式。

    • 小括号和字符间不要有空格。

    • 保留字和括号直接要有空格。

    • 举例:

      public static void main(String[] args) {
          // 缩进 4 个空格
          String say = "hello";
          // 运算符的左右必须有一个空格
          int flag = 0;
          // 关键词 if 与括号之间必须有一个空格,括号内的 f 与左括号,0 与右括号不需要空格
          if (flag == 0) {
          	System.out.println(say);
          }
          // 左大括号前加空格且不换行;左大括号后换行
          if (flag == 1) {
          	System.out.println("world");
          // 右大括号前换行,右大括号后有 else,不用换行
          } else {
          	System.out.println("ok");
          // 在右大括号后直接结束,则必须换行
          }
      }
      

3-3 面向对象进阶

封装

课堂笔记
  • 封装的意义在于保护和防止类成员被无意中破坏,应封装后对外提供接口,并在封装的方法中进行检查和操作。
  • 建议使用所有属性进行private封装,通常对封装后的数据需要对外提供设置和获取的方法,以供外部使用。

this 关键字

课堂笔记
  • 指的本身的引用,在类中使用this引用访问类中的成员,效果几乎等同于在外部使用某个对象名访问类中的成员即this.func()几乎等同于在外部使用对象实例xxx访问xxx.func(),但是,使用this引用可以不用考虑private封装的问题。
  • 在类中直接使用this()相当于使用了类的无参构造方法,而使用this(x,y)则为有参构造方法。
  • 特别值得注意:当使用this进行构造方法调用时,一定要先调用初始化对象后,才能使用对象的相关逻辑,否则会报错。

静态static

课堂笔记
  • 利用编辑器快捷方式可以直接创建出GetSet方法模板。
  • 静态修饰后的属性内存分配时不再跟着对象在堆中分配,而是在方法区中进行分配,该属性是属于类的,当然对象也可以访问到,只是不建议这么做,直接使用类名就可以访问。
  • 也就是说静态修饰后的属性是所有对象所共有的。即使没有对象,该属性仍然存在且可以通过类名使用
  • 静态资源不能访问动态资源,因为动态资源是在静态资源之后才在内存中分配空间的。
    • 例如在未创建对象时,可以使用类名访问到静态资源。
    • 但是若静态资源中有访问到动态资源,则程序报错。

包的概念

课堂笔记
  • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  • 包如同文件夹一样,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
  • 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
  • 规范:通常由多个单词组成, 所有单词的字母小写, 单词与单词之间使用.隔开 ,一般命名为com.公司名.项目名.模块名....
  • 在使用其他包中的类时,需要导包操作,即import xxx.yyy.......,必须包含到需要使用的类。或者也可以不使用导包操作而直接写上需要使用的类的全名称
  • 系统默认帮忙导入了java.lang包,其提供了经常使用的类,例如String类

权限修饰符

课堂笔记
  • 权限修饰后,规定了访问的权限,分为四个区域:
    • 类:范围最广
    • 包:相比少了private修饰的资源
    • 子类:相比少了private和default
    • 其他包:相比少了protected、private和default,也就是只能访问public。

代码块

课堂笔记
  • 普通代码块:编写在顺序执行的代码流程中的代码块为普通代码块。
  • 构造代码块:在类中使用大括号括起来的代码块,无论你放在类中哪个位置,均在构造方法前进行执行。可以存在多个构造代码块,可以利用其每次创建对象时都会执行一次的特性来做一些必要的准备工作。
  • 静态代码块:在构造代码块前使用static进行修饰,与构造代码块的区别在于其属于类,之后在加载类的时候执行一次,创建对象时并不会执行。
  • 代码块执行的先后顺序:静态代码块 --> 构造代码块 --> 构造方法

main 方法详解

课堂笔记
  • 程序之所以能够执行,是需要被JVM调起的,而JVM规定只调用名为:public static void main(String[] args)的静态方法。
  • 其中参数String[] args是我们在控制台运行JVM时,传入的参数,然后JVM调用main方法时继续将该值传给此静态方法。

你可能感兴趣的:(Java基础,java,javase,javaee,面向对象编程)