Java 核心教程读后笔记

9/30/2018

const 是 Java 保留的关键字, 但目前并没有使用。 在 Java 中, 必须使用 final定义常量。
如果需要用许多小段的字符串构建一个字符串, 那么应该按照下列步骤进行。 首先, 构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();
当每次需要添加一部分内容时, 就调用 append 方法。
builder.append(ch); // appends a single character
在需要构建字符串时就调用 toString 方法, 将可以得到一个 String 对象, 其中包含了构建器中的字符序列。
String completedString = builder.toString();

StringBuffer为线程安全的

我们使用Scanner进行输入的录入
构造方法 Scanner in = new Scanner(System.in);
使用实例的方法 System.our.println(in.nextline()); 直接输出下一行

使用 Scanner in = new Scanner(Paths.get(“C:\Users\CJW\Desktop\daynote.txt”), “utf-8”);
读取一个文件的一行。

在我们使用Scanner和PrintWriter对文件内容进行操作时,必须抛出throws IOException

封装
在程序中我们可以使用类的方法,并只需要知道方法名和参数,不必知道它的具体实现过程。

对象和对象变量
Date deadline 这是定义了一个Date类型的变量
当你定义了一个对象变量,如果想要使用这个对象的方法。你需要初始化这个变量。
1、使用新构造的对象初始化这个变量。如 deadline = new Date(); 使用构造器。
2、让这个对象变量去引用一个已经存在的变量。如deadline = birthday; birthday为已经构造好并存在的一个变量。
所以一个对象变量并没有实际包含一个变量,而是引用了一个对象。
在java中所有的对象变量的值都是存储在另一个地方的那个对象的一个引用。

java类库中表示时间:一个是用来表示时间点的 Date 类;另一个是用来表示大家熟悉的日历表示法的 LocalDate 类。

10/2

我们可以使用public来标记方法,让外部类可以可以调动这些方法。
实例域中一般存放需要操作的数据(使用private来标记)。这些数据外部的访问可以提供方法,也就是Set和Get方法。

关于构造器:构造器必须与类同名,每个类可以有多个构造器,构造器可以有多个参数,没有返回值,总是伴随着new一起调用。

显示参数是指直接写在方法名后面的括号中,隐式参数是没有出现在方法名后面括号中的参数。

由static修饰的变量属于它所在的类,而不属于任何对象。
不使用static修饰符,这个变量将作为这个类的一个实例域。我们需要使用对象来访问这个变量,而且每一个对象都会有一个对这个变量的拷贝。

在一个非静态的方法中,我们使用this参数作为方法中得隐式参数。

每个类可以有一个main方法,我们可以在这个类中进行单元测试。

方法参数:
值调用(call by value)表示方法接收的是调用者提供的值
引用调用(call by reference)表示方法接收的是调用者提供的变量地址

10/3

java对对象采用的不是引用传递而是值传递。
java中只有值传递。

例子验证

public class ValueTransfer {

    /**
     * 在java中 只有值传递 没有引用传递
     * 方法修改的是对象引用的拷贝
     * 这里设计一个交换程序,测试java中并没有引用传递
     */

    public static void swap(Employee a, Employee b) {
        Employee temp = a;
        a = b;
        b = temp;
    }

    public static void main(String[] args) {
        Employee t1 = new Employee();
        t1.setName("sa");
        Employee t2 = new Employee();
        t2.setName("as");
        /**
         * 在这里我们生成了t2和t1的拷贝  a 与b
         * 在swap方法中 a和b参数的值发生了变化  但是在方法结束后这两个参数就被丢弃了
         * t1 与 t2 仍然使用的是之前的引用
         */
        System.out.println(t1.getName() + "," + t2.getName());
        swap(t1, t2);
        System.out.println(t1.getName() + "," + t2.getName());

    }
}

方法通过对象引用的拷贝修改所引用的对象的状态。

静态方法不能对对象实施操作,静态方法不能访问实例域中的数据,就是因为它不能操作对象。
但是它可以访问静态域中的数据。

idea中使用/** + 回车 生成代码注释块

10/5

45章结束 再看一节英语词汇5

构造器
我们在编写类的时候如果没有编写构造器,那么系统会自动生成一个无参的构造器。
我们可以通过编写有参的构造器来给对象赋值。

但如果我们编写了有参数的构造器,我们在实例化的时候必须将参数写上,或者再提供一个无参的构造器。

一个构造器中,我们可以使用实例域中的变量名字来命名参数,在构造器中使用this.name 来表示实例域中的变量,用name来代表参数。

继承
"is-a"规则,子类的每个对象也是超类的对象。例如每个Manager也是一个Employee。

变量对象的多态性
就是说一个对象变量既可以引用它所属类的对象,也可引用它子类的对象。

超类和子类

我们使用super关键字来调用超类中的方法。
在类型转换之前我们可以使用instanceof操作符来验证是否可以转换成功。
类型转换:
1、只能在继承的层次内进行类型转换
2、将超类转换为子类之前,我们应该使用instanceof进行类型验证

抽象类
抽象类不可以被实例化,但是我们可以定义一个抽象对象,来引用它非抽象子类的实例。

java的访问修饰符
1 ) 仅对本类可见 private。2 ) 对所有类可见 public:
3 ) 对本包和所有子类可见 protected。
4 ) 对本包可见—默认(很遗憾,) 不需要修饰符。

ObJect是所有类的超类。 在java中只有基本类型不是对象。
基本类型:整型:int、short、long、byte byte 1字节 Int 4字节
浮点类型:double、float
boolean类型:boolean
字符型:char

java中使用==比较基本类型域,使用equals()比较对象域

equals重写

public boolean equals(Object obj) {
        //如果这个比较的类型就是它自己本身,返回true
        if (this == obj) {
            return true;
        }
        //如果比较的类型是空,那就返回false
        if (obj == null) {
            return false;
        }
        //如果比较的类型不同,返回false
        if (getClass() != obj.getClass()) {
            return false;
        }
        //将对象强行转换为需要比较的类型
        Employee other = (Employee) obj;

        //使用equals比较对象域数据是否相同   使用==比较基本数据类型域是否相同
        return Objects.equals(name, other.name) &&
                salary == other.salary &&
                Objects.equals(date, other.date);
    }

数组的toString方法
调用Arrays.toString()方法将数组转换为字符串的形式

ArrayList是一个采用了类型参数的泛型类

//构造一个Employee对象的数组列表
        ArrayList<Employee> staff = new ArrayList<>();
        //ArrayList会动态的分配空间
        staff.add(new Employee("c",1,1,1,1));
        staff.add(new Employee("j",1,1,1,1));

使用add()方法为数组添加元素
使用 size()方法返回ArrayList中实际存在的元素数目。

对象包装类 Integer、Long、Float、Double、Short、Byte、Character 、 Void 和 Boolean (前
6 个类派生于公共的超类 Number)

针对包装类而言 当将一个 Integer 对象赋给一个 int 值时, 将会自动地拆箱,反过来自动装箱。

使用静态方法 parseInt(String s ) 可以将字符串转换为 int

枚举类
public enuni Size { SMALL, MEDIUM, LARGE, EXTRAJARGE };
实际上, 这个声明定义的类型是一个类, 它刚好有 4 个实例, 在此尽量不要构造新对象。实例个数确定。

10/9

接口

接口中的所有方法自动属于public。接口中绝对不能含有实例域。

在对象数组想要使用sort方法时,需要先实现Comparable<>接口中的compareTo()方法。
static int compare(double x , double y ) 1.4
如果 x < y 返回一个负数;如果 x 和 y 相等则返回 0; 否则返回一个负数。(注意除了相等都是返回负数的)
因为基本的方法无法对象大小进行判别。

可以创建接口变量,必须引用实现了接口的类对象。

接口和抽象类

由于java不支持多重继承,每个类一直继承一个类。
对于一个类而言可以去实现多个接口,就由接口来变相实现多重继承

java SE8 中,可以在接口中增加静态方法。

对象克隆
一个包含对象引用的变量建立副本时,原变量和副本都会是同一个对象的引用,任何一个对象改变都会引起另一个对象的改变。

浅拷贝和深拷贝
深拷贝和浅拷贝都是对象拷贝
浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝把要复制的对象所引用的对象都复制了一遍。