Java核心技术-卷1 读书笔记【第四章】

第四章 对象与类

4.1 面向对象程序设计概述

4.1.1 类 class

  • 由类构造(construct)对象的过程称为创建类的实例(instance)
  • 对象中的数据称为实例域

4.1.3 识别类

  • 面向对象分析的思路——首先从设计类开始,然后向每个类中添加方法:类常常对应名词,方法常常对应动词

4.1.4 类之间的关系

常见的关系有:依赖、聚合、继承

  • 依赖(uses a)
    A类的方法操纵B类的对象,那么就说A类依赖于B类
    注:减少类之间的依赖程度和数量,即降低类之间的耦合度
  • 聚合(has a)
    一个A对象包含着一些B对象,是整体与个体的关系

4.2 使用预定义类

4.2.1 对象与对象变量

使用构造器constructor构造新实例(构造并初始化对象)

  • 若想要构造一个Date对象,需要在构造器前面加上new操作符,例:new Date() ,这个新对象被初始化为当前的日期和时间
  • Date deadline = new Date();其中deadline是对象变量。
    一个对象变量并没有包含任何一个实际对象,而仅仅是引用一个对象(个人理解,仅指向堆上的一个对象)

4.3 用户自定义类

  • 在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类
  • 练习EmployeeTest程序
import java.time.*;

public class EmployeeTest {
    public static void main(String[] args) {
        System.out.println("Hello" );
        Employee[] staff = new Employee[3];

        staff[0] = new Employee("A", 200, 1991, 1, 1);
        staff[1] = new Employee("B", 300, 1992, 2, 2);
        staff[2] = new Employee("C",400,1993,3,3);

        for (Employee e:staff)
            e.raiseSalary(5);

        for (Employee e:staff)
            System.out.println("name = "+e.getName() + ",salary = " + e.getSalary() + ",hireday = " + e.getHireDay());
    }

}

class Employee{
    private String name;
    private double salary;
    private LocalDate hireDay;

    //构造函数
    public Employee(String n,double s,int year,int month,int day){
        name = n;
        salary = s;
        hireDay = LocalDate.of(year,month,day);
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    public LocalDate getHireDay() {
        return hireDay;
    }

    public void raiseSalary(double byPersent){
        double raise = salary * byPersent/100;
        salary += raise;
    }
}

注:开始还用eclipse试了一下,发现我还是喜欢IDEA哈哈,然后找了一下idea创建java文件时自动添加作者和创建时间的方法,参考了这篇 https://blog.csdn.net/qq_39098813/article/details/80731698

4.3.4 构造器

  • 每个类可以有一个以上的构造器
  • 构造器总是伴随着new操作一起调用
 staff[0] = new Employee("A", 200, 1991, 1, 1);

这里的Employee,是调用的构造器(调用构造函数?存疑)

  • 没有new就无法创建新对象

4.3.6 封装的优点

  • 思考:若把getName方法,修改为将name域被标记为public,来完成数据的访问,会更容易么?答:name在构造器中设置完毕后,就没有任何一个办法可以对他进行修改,这种方法确保name域不会受到外界的破坏。

4.3.9 final实例域

final关键字只是表示存储在这个变量中的对象引用不会指向其他的对象,但是这个对象本身是可以更改的

4.4 静态域和静态方法

4.4.1 静态域

如果将域定义为static,每个类中只有一个这样的域,静态域属于类,不属于任何独立的对象

4.4.2 静态常量

  • System.out就是一个静态常量

4.4.3 静态方法

静态方法是一种不能像对象实施操作的方法,例如:Math.pow(x,a),运算时不使用任何Math对象,即没有隐式的参数

  • 静态方法不能访问实例域,因为它不能操作对象,但是静态方法可以访问自身类中的静态域
  • 可以通过类名调用静态方法,不需要使用对象来调用静态方法
  • 两种使用静态方法的情况:①一个方法不需要访问对象状态,其所需参数都是通过显示参数提供的,如Math.pow ②一个方法只需要访问类的静态域

4.4.4 工厂方法

这节没看懂啊????讲啥呢

4.4.5 main方法

  • 每个类可以有一个main方法,用于单元测试,执行的时候选择真正写逻辑的main来执行就行

4.6 对象构造

4.6.1 重载

  • 重载:多个方法有相同的名字、不同的参数
  • 重载解析过程:编译器挑选出具体执行哪个方法的过程
  • 重载不可以更改返回类型

4.6.6 调用另一个构造器

  • 如果构造器的第一个语句形如this(…),这个构造器将调用同一个类的另一个构造器

4.7 包

  • 使用包的主要原因:确保类名的唯一性
  • 从编译器的角度看,嵌套的包之间没有任何关系
  • import某个包之后,对于代码的大小没有任何负面影响
  • 只能以(*)导入一个包
  • import还可以导入静态方法和静态域,如
import static java.lang.System.*;
/**
 * @Author:Wconquer
 * @Date:2019/8/14 15:32
 */

public class PackageTest {
    public static void main(String[] args) {
        out.println("Hello,World!");
    }
}
  • 如果没有指定public或private,这个部分可以被同一个包中的所有方法访问

4.8 类路径

真实没看懂

你可能感兴趣的:(Java)