Java核心技术 卷一 复习笔记(丙

面向对象
1.面向对象设计概述
  1.1.面向对象是什么
    面向对象是一种程序设计范型(简称OOP),是针对对象进行开发,简化开发过程的一种设计方式
  1.2.类
    类是构造对象的模板,相当于一个烘焙模板,而对象相当于烘焙出来的面包,而烘焙的过程被称为创建类的实例(instance)
    封装
      是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。
      对象中的数据被称为实例域(instance field),
      操纵数据的过程被称为方法(method).实现封装的过程在于 绝对不能让类中的方法直接地访问其他类的实例域,即不能用当前数据去直接调用其他对象中的数据。
    继承
      后面会单独列出
    抽象
      一个类中没有足够的信息来描述一个具体对象,这样的类就是抽象类。
      抽象类除了不能实例化对象之外,其他功能依然存在,成员变量、成员方法和构造方法的访问方法和普通类一样。
      抽象类必须继承才能使用。父类包含了子类集合的常见方法,而父类本身是抽象的,所以不能使用这些方法。

      在java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,但能实现多个接口。
  1.3.对象
      对象包含三个特征:行为,状态,标识
      行为是指对对象可以施加哪些操作和方法
      状态是指描述当前特征的信息
      标识是指唯一身份ID
  1.4.类之间的关系
     常见关系有 依赖,聚合,继承
      依赖是指一个类的方法操纵另一个类的对象
      聚合是指一个类的对象中包含另一个类的一部分对象
      继承是指一个类扩展为另一个类,不仅会继承被扩展类中的方法,而且还拥有其他功能
2.预定义类
   预定义类是指针对没有面向对象特征而封装的类。
    2.1对象与对象变量
      要想使用对象,就必须首先构造对象, 并指定其初始状态。然后,对对象应用方法。
      在java中,使用构造器(constructor)构造新实例,构造器的名字应与类名相同,构造时,需要在构造器前面添加 new 操作符
    2.2LocalDate类的使用
      LocalDate不能使用构造器来初始化对象,应当使用静态工厂方法(factory method)代表调用构造器
      LocalDate.now() 表示构造这个对象时的日期
      static Local Time now( ) 构造一个表示当前日期的对象。
      static LocalTime of(int year, int month , int day ) 构造一个表示给定日期的对象。
      int getYear( )
      int getMonthValue( )
      int getDayOfMonth( )
      得到当前日期的年、月和日。
      DayOfWeek getDayOfWeek     得到当前日期是星期几, 作为 DayOfWeek 类的一个实例返回。 调用getValue来得到1-7 之间的一个数,表示这是星期几,1 表示星期一,7 表示星期日。
      Local Date piusDays(int n )
      Local Date minusDays(int n)
      生成当前日期之后或之前 n 天的日期
3.自定义类
  3.1构造器
    构造器与类同名,每个类可以有一个以上的构造器
    构造器可以有 0 个、1 个或多个参数
    构造器没有返回值
    构造器总是伴随着 new 操作一起调用
  3.2隐式参数与显式参数
    隐式参数 是指在方法中使用,但没有写在方法参数中也没有在方法体内声明的变量。
    显式参数 是指在方法中声明使用的参数
    在使用隐式参数时,会使用 this 关键字调用该方法的当前类的当前实例
  3.3final实例域
    实例域可以定义为final,已确保每一个构造器执行后,这个域的值被设置,并且在后面操作中不能再被修改
4.静态域和静态方法
  4.1 静态域
    将域定义为static,每个类中只有一个这样的域。当前类中所有实例共享一个静态域。静态域只有一个,只属于类,不属于任何独立的对象
  4.2 静态常量
    是将常量用关键字static进行修饰。
    例如:
      public static final double PI = 3.14;
  4.3 静态方法
    静态方法是一种不能向对象实施操作的方法。
    使用静态方法的场景
    一个方法不需要访问对象状态,其所需参数都是通过显式参数提供
    一个方法只需要访问类的静态域
  4.4 工厂方法
    工厂方法是对静态方法的扩展,是使用静态工厂方法来构造对象
  4.5 main方法
    main方法是一个静态方法,不对任何对象进行操作。事实上,在启动程序时还没有任何一个对象。静态main方法将执行并创建爱你程序所需要的对象。
5.方法参数
  在程序设计中有两种传递方式,按值调用(值传递)表示方法接收的是调用者提供的值。按引用调用(引用传递)表示方法接收的是调用者提供的变量地址。
  java程序设计语言总是采用也按值调用。也就是说方法得到的是所有参数值得一个拷贝,方法不能修改传递给它的任何参数变量的内容。
  方法参数有两种类型 一种是基本数据类型,一种是对象引用
    java中方法参数的使用情况
      1.一个方法不能修改一个基本数据类型的参数
      2.一个方法可以改变一个对象参数的状态
      3.一个方法不能让对象参数引用一个新的对象
6.对象构造
  6.1 重载
    有些类有多个构造器。通过构造一个空的对象,或指定初始化实现重载。多个方法有相同的名字、不同参数,便产生了重载。
    编译器通过用各种方法给出的参数类型与特定方法调用使用的值类型进行匹配来挑选出相应的方法,这个过程被称为重载解析
  6.2 默认域初始化
    如果在构造器中没有显式的给域赋予初值,那么就会被自动地赋为默认值。一般建议对域进行明确的初始化,已保证程序的可读性
  6.3 无参数的构造器
    对象由无参数构造函数创造函数创建时,其状态会设置为适当的默认值。
    在编写一个类时没有编写构造器,那么系统会提供一个无参数构造器。这个构造器会将所有的实例设置为默认值。
    如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会视为不合法。
  6.4 参数名
    参数变量用同样的名字将实例域屏蔽,使用this关键字,进行隐式参数访问。
  6.5 构造器调用
    在构造器中可以使用this(),调用同一类的另外一个构造器。
  6.6 初始化块
    在一个类的声明中,可以包含多个代码块,只要构造类的对象,这些块就会被执行。
  构造器执行步骤
    1.所有数据域被初始化,赋予默认值
    2.按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块
    3.如果构造器第一行调用了第一个构造器,则执行第二个构造器主体
    4.执行当前构造器主体
    在初始化过程中,可以将初始化代码放入静态的初始化块中,使用static关键字进行标记
      eg: static{
        //获取随机数
        Random generator = new Random();
        nextId = generator.nextInt(lOOOO);
        ...
        }
    Random() 造一个新的随机数生成器。
    int nextint(int n) 返回一个 0 ~ n-1之间的随机数。

    在类第一次加载的时候, 将会进行静态域的初始化.
7.包
  Java允许使用包(package)将类组织起来,用于与别人提供的代码库分开管理
  7.1 类的导入
    一个类可以使用所属包中的所有类,以及其他包中的公有类。
    可以通过两种方法访问另一个包中的公有类:
    1.在类名前添加完整的包名
    2.使用import语句导入
  7.2 静态导入
    import语句不仅可以导入类,还能导入静态方法和静态域的功能
    eg: import static java.lang.System.*;
    导入特定的方法和域

补充:
1.关键字
this 和 super
  this是在类的内部代表正在执行此代码的对象,可以通过this关键字来访问类的成员属性和成员方法
  super是在子类的构造方法中调用父类的构造方法,必须写在子类构造方法的第一行,原因是父类构造方法没有执行之前父类的属性和方法都没变创建,无法被继承,子类方法就不能执行
共同点:super和this都可以代表一个临时对象执行构造函数,并且都要放在构造函数的第一行;
不同点:super一般用在子类中,用于代表父类的对象;this用于当前类中,用于代表正在执行该代码的对象

final 与 static
  final 用来修饰类、方法、变量,表示类不能被继承。
    修饰类时,表示类中的所有成员方法都是final方法,修饰方法时,表示方法锁定,类的private方法会被隐式地指定为final方法
    修饰变量时,表示该变量的数组在初始化后不能再修改,不能再指向另外一个对象
  static 表示用来修饰的方法或变量不需要依赖对象来进行访问,只要被类被加载,即可通过类名进行访问
  static变量的生命周期,在类加载时开始,类销毁时结束

final 和 finally
final 是用来修饰类、方法、变量,表示类不能被继承。
finally 用在try catch语句块中,表示该语句内的代码一定会执行


2.重载重写
  重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
  重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

重写规则
  参数列表必须完全与被重写方法的相同。
  返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类
  访问权限不能比父类中被重写的方法的访问权限更低。
  父类的成员方法只能被它的子类重写。
  声明为 final 的方法不能被重写。
  声明为 static 的方法不能被重写,但是能够被再次声明。
  子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
  子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
  重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  构造方法不能被重写。
  如果不能继承一个方法,则不能重写这个方法。
重载规则
  被重载的方法必须改变参数列表(参数个数或类型不一样);
  被重载的方法可以改变返回类型;
  被重载的方法可以改变访问修饰符;
  被重载的方法可以声明新的或更广的检查异常;
  方法能够在同一个类中或者在一个子类中被重载。
  无法以返回值类型作为重载函数的区分标准。

区别:
      重写            重载
参数列表   必须与父类相同      必须和父类不同
返回类型   必须和父类相同      可以和父类不同
异常     可减少或删除,不能    可以和父类不同
      抛出新的或更广的
访问      可扩大权限,不能缩小   可和父类不同

总结:
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
  (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
重写是对父类方法的扩展,而重载是对一个方法的多个扩展

3. 对象可见性(public private protected default)
        同包               不同包
修饰符    同类    子类    非子类    子类    非子类
public      √     √     √     √    √
private    √      ×      ×      ×     ×
protected    √       √         √     √     ×
default    √      √      √       ×      ×
访问权限 public > protected > default > private

posted @ 2019-12-23 17:37  47Knife  阅读(201)  评论(0编辑  收藏  举报