• [Java核心技术]第四章-对象与类(4.1-4.6)


    4.1面向对象程序设计概述

    OOP(面向对象编程Object Oriented Programming)

    OOP中数据第一位,算法第二位。

    封装:关键在于不能让其他方法直接访问类的实例域,程序仅通过对象的方法与对象交互。
    实例域:对象中的数据。

    对象

    对象的三个主要特性:

    1. 对象的行为:可以对对象施加哪些方法。
    2. 对象的状态:对于每个特定对象都有一组特定的实例域值,这些值的集合就是对象的当前状态。
    3. 对象标识:如何辨别具有相同行为与状态的不同对象???

    类之间最常见的三种关系

    1. 依赖(uses-a):类A的方法操纵类B的对象,则A依赖于B。应尽量避免依赖,即解耦。
    2. 聚合(has-a):类A的对象包含类B的对象。
    3. 继承(is-a):特殊继承一般。

    4.2 使用预定义类

    对象与对象变量

    • 构造对象:使用new操作符+构造器。构造器总是伴随着new方法一起调用
    • 对象变量必须先初始化才能当作对象使用。
    • 可以将Java对象看作C++的对象指针。
    • 所有Java对象都存储在堆中。
    • Java中,必须使用clone方法才能获得对象的完整拷贝。

    Java类库中的Date类和LocalDate类

    Date类:表示时间点
    LocalDate类:日历表示法

    更改器方法与访问器方法

    更改器方法:原对象会被改变。
    访问器方法:原对象不会被改变。

    4.3 用户自定义类

    Employee类

    在源文件中,只能有一个public类,并且文件名与public类类名相同,但可以有任意数目的非公有类。

    多个源文件的使用

    编译多个源文件的程序时,只需javac 含主方法的文件 即可,编译器会自动查找编译使用到的类。并且,若之前编译过,若java编译器发现Employee.java较之前Employee.class有更新,会再编译新版本。

    剖析Employee类

    • 强烈建议将实例子域标记为private。private确保只有类自身的方法能访问该实例域。
    • 一般将方法标记为public。public意味任何类的任何方法都可调用本方法。

    从构造器开始

    必须注意在所有方法中不要命名与实例域同名的变量,否则局部变量会屏蔽同名实例域。

    隐式参数与显式参数

    • 方法中,关键字this表示隐式参数。
    • Java中,所有方法必须在类内部定义,但并不表示它们是内联方法,是否将某个方法设置为内联方法是Java虚拟机的任务。

    封装的优点

    • 获得实例域的值,用get set 方法(域访问器方法/域更改器方法)好处:

      1. 可以改变内部实现,除了该类的方法外,不影响其它代码。
      2. 更改器方法内部可以写错误检查等语句。
    • 不要编写返回 引用可变对象 的访问器方法,要返回一个可变对象的引用,应首先对它进行克隆(clone方法)。

    基于类的访问权限

    一个方法可以访问所属类的所有对象的私有数据,而不仅限于访问隐式参数的私有特性。

    私有方法

    可以设置一些辅助方法为private的,并且由于不会被其他类调用,所以可以随时删去。

    final实例域

    final修饰符修饰的实例域必须在构建对象时初始化,即确保在构造器执行之后这个实例域被赋值。一般用来修饰基本类型域、或不可变类的域,否则容易造成混淆。

    4.4 静态域与静态方法

    静态域与实例域

    类中带有static关键字的属于静态域。每个类只有一个静态域,静态域属于类。而每个对象对于所有的实例域都有自己的一份拷贝,即每个对象都有一个自己的实力域。

    静态常量

    • 静态变量使用的较少,静态常量使用的较多,例如public static final double PI=3.1415926535...;
    • static 静态
    • final修饰的局部变量,一旦赋值,无法改变——常量。
    • 由于每个类的对象都可以对公有域进行修改,所以最好不要将域设计为public。但将final域设为public却没问题,因为它不允许被修改。

    静态方法

    用static修饰的方法,只能通过类名调用。
    使用的两个情景:

    1. 一个方法所有参数都是通过显式参数提供,即没有this参数。
    2. 一个方法只需要访问类的静态域。

    静态工厂方法——除使用构造函数外另一种创建实例的方法。

    • 定义:不通过 new,而是用一个静态方法来对外提供自身实例的方法,即为静态工厂方法(Static factory method)。
      Fragment fragment = MyFragment.newIntance();
    • 考虑使用静态工厂方法代替构造器

    因为静态工厂方法有诸多优点,总的来说,能够增大类的提供者对自己所提供的类的控制力

    • 有名字
    • 可以返回原类型的子类
    • 可以有多个参数相同但名称不同的工厂方法
    • 可以减少对外暴露的属性
    • 多了一层控制,方便统一修改
    • 非常棒的参考链接 https://www.cnblogs.com/dyj-blog/p/8867028.html

    main方法

    • main方法是一个静态方法。在启动程序时还没有任何对象,静态的main方法将执行并创建程序需要的对象。
    • 在一个类中可以有一个main方法,是一个常用的单元测试的技巧。
      • 如果想要独立地测试Employee类,只需要执行java Employee;如果Employee类是一个更大型应用Application的一部分,就可以执行java Application,Employee类的main方法将永远不会执行。

    4.5 方法参数

    Java语言中,方法参数的传递方式总是按值调用(包括当对象引用作为参数时,也是按值传递,拷贝一份对象引用),方法不能修改传递给它的任何参数变量的内容。

    4.6对象构造

    重载

    方法的签名:要完整的描述一个方法,需要指出方法名、参数类型。
    返回类型不是方法名的一部分,不能有两个方法名、参数类型相同却返回值不同的方法。

    默认域初始化

    域与局部变量的主要不同点:如果没有初始化类中的域,域会被初始化为默认值。而方法中的局部变量必须明确地初始化。

    初始化数据域方法二:显式域初始化,会在构造器之前执行。

    可以在域声明中赋值。

    初始化数据域方法三:使用初始化块,会在构造器之前执行。

  • 相关阅读:
    openCV中cvSnakeImage()函数代码分析
    程序所有重构,升级的目标(备注,更新)
    基础总结篇之中的一个:Activity生命周期
    Tomcat全攻略
    VRRP协议具体解释
    二叉树三种遍历(递归以及非递归实现)
    AssertValid函数学习
    java定时器的使用(Timer)
    循环队列
    使用Heartbeat实现双机热备
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10598552.html
Copyright © 2020-2023  润新知