字符串

字符串是不可改变的. 所以修改字符串通常需要用到substring方法:

String greeting = "Hello";
greeting = greeting.substring(0, 3) + "p!";
// Help!
System.out.println(greeting);

而判断字符串是否相等, 需要s.equals(t), 而不能使用"==", 是因为"=="只能确定两个字符串是否放在同一个位置上, 但是完全存在相同的字符串放在不同的位置上.

 



输入输出

标准输出直接用System.out.println()即可, 但是如果是标准输入的话, 则需要构建一个Scanner对象, 然后与System.in关联即可.

Scanner in = new Scanner(System.in);
System.out.println("What is your name?");
String name = in.nextLine();
System.out.println(name);

而基本的Scanner方法如下:
Scanner (InputStream in): 用给定的输入流创建一个Scanner对象.
String nextLine(): 读取下一行内容
String next(): 读取下一个单词
int nextInt()/nextDouble(): 读取并转换下一个整数/浮点数.
boolean hasNext()/hasNextInt()/hasNextDouble(): 检测是否还有表示整数或浮点数的写一个字符序列.

要想对文件进行读取, 需要一个用File对象构造一个Scanner对象, 而写入一个文件则需要构造一个PrintWriter对象:

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.io.File;

/**
 * Created by lgt on 16/6/23.
 */
public class Welcome {
    public static void main(String[] args)
    {
        try {
            Scanner in = new Scanner(new File("myfile.txt"));
            PrintWriter out = new PrintWriter("output.txt");
            while (in.hasNext()) {
                String s = in.nextLine();
                out.write(s);
            }
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}



数组

Java中的数组间拷贝时候, 实际上是两个变量引用了同一个数组. 一般情况下, 需要使用Arrays.copyOf方法进行深拷贝:

import java.io.FileNotFoundException;
import java.util.Arrays;

/**
 * Created by lgt on 16/6/23.
 */
public class Welcome {
    public static void main(String[] args)
    {
        int[] a = {1, 2, 3, 4, 5};
        int[] b = a;
        b[1] = 111;
        // 111
        System.out.println(a[1]);

        int[] c = {1, 2, 3, 4, 5};
        int[] d = Arrays.copyOf(c, c.length);
        d[1] = 111;
        // 2
        System.out.println(c[1]);
    }
}



面向对象程序设计概述

类: 构造对象的模板或蓝图.

封装: 将数据和行为组合在一个包中, 并对对象的使用者隐藏了数据的实现方式.对象中的数据称为实例域, 操纵数据的过程称为方法.

实现封装的关键在于绝对不能让类中的方法直接的访问其他类的实例域.

对象有三个主要特性:

1. 对象的行为--可以对对象施加哪些操作/方法.

2. 对象的状态--当施加那些方法时, 对象如何响应?

3. 对象标识--如何辨别具有相同行为与状态的不同对象?

 



使用预定义类

类的对象必须初始化后才能使用, 即类的对象类似于C++的指针, 而非引用.

一个对象变量并没有实际包含一个对象, 而仅仅引用一个对象.

import java.util.Date;

/**
 * Created by lgt on 16/6/23.
 */
public class Welcome {
    public static void main(String[] args)
    {
        String s = new Date().toString();
        System.out.println(s);
        // Error
        Date deadline;
        deadline.toString();
    }
}



自定义类

基本的格式如下:

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

    public Employee(String n, double s, int year, int month, int day)
    {
        name = n;
        salary = s;
        GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
        hireDay = calendar.getTime();
    }

    public String getName()
    {
        return name;
    }

    // ...
}

1. 构造器和类同名, 而且总是伴随着new操作符的执行而调用.
2. 不要返回一个引用对象, 否则在类外就可以对这个变量进行修改, 如:

public Date getHireDay()
{
    return hireDay;
}

Employee e = new Employee("leicj", 1234, 2011, 1, 1);
Date d = e.getHireDay();
d.setTime(d.getTime() - 1000000000);
// e中的hireday被修改.
System.out.println(e.getHireDay());

如果需要返回一个可变对象的引用, 则对它进行克隆即可:

public Date getHireDay() {
  return hireDay.clone();
}

3. 可以将实例域定义为final, 这种情况下必须初始化, 但后续无法对这个变量进行更改.

4. 默认构造函数只会在没有任何构造器的情况下生成. 构造函数调用构造函数需要用到this:

public Employee(double s) {
  this("Employee #" + nextId, s);
  nextId++;
}

 



Java允许使用包(package)将类组织起来. 类的导入使用import关键字, 如果导入静态方法, 则使用import static.
如果要打包, 则使用package关键字即可.

下面是一个基本的目录结构:

src
  --com.horstmann.corejava
    --Employee.java
  --PackageTest

而Employee中的代码为:

package com.horstmann.corejava;

public class Employee
{
    private String name;

    public Employee(String n)
    {
        name = n;
    }

    public String getName()
    {
        return name;
    }
}

则我们可以在PackageTest中通过: import com.horstmann.corejava.*; 进行调用.