关键字final 表示常量:
final double NUM=1;final 表示这个变量(通常大写)只能被赋值一次。 static final 表示类常量,其他方法可以使用这个常量。
字符串 String类: String类对象为不可改变的字符串; //C++ string类可以修改
获取子串的方法:substring(a,b); 从a开始直到b-1;
比较两个字符串是否相等的方法: 区分大小写 : s.equals(t) //比较s与t 不区分大小写 : s.equalsIgnoreCase(t) (不能使用==运算符比较!!)
输入: 在开头加上: import java.util.*; 创建Scanner类的对象,用标准输入流System.in;
Scanner in = new Scanner(System.in); String name = in.nextLine(); //输入一行字符串,包括空格 in.next(); //不包括空格 in.nextInt(); //整数 in.nextDouble(); //浮点数输出:
string name = "Simon"; System.out.printIn(name); //自动换行,PS: print();不换行 double x; System.out.printf("%8.2f",x); //格式化输出,8个字符的宽度和小数点后两位的精度 数组声明: int[] a=new int[n]; 求数组长度: int len=a.length; for each循环:for(int element: a){} //遍历数组a的每一个元素 匿名数组: a = new int[] {1,3,5,6,7}; //创建新数组初始化数组a 数组拷贝: int[] b=Arrays.copyOf(a,a.length); //第二个参数是新数组的长度 多维数组: int[][] c=new int[n][m]; 不规则数组: int[][] c=new int[n][]; for(int i=0;i<n;i++) c[i]=new int[i+1];一个对象变量不是实际包含一个对象,而仅仅是引用一个对象,new的返回值也是一个引用。
Date deadline = new Date(); deadline = null; //表示deadline变量目前没有引用任何对象new Date() 构造了一个Date类型对象,它的值是对新创建对象的引用。 这个引用存储在变量deadline中。
Java的对象变量等同于C++的对象指针:
Date b; //Java Date* b; //C++调用另一个构造器(构造函数): 若构造器的第一个语句形如this(…),这个构造器将调用同一个类的另一个构造器。
public Emplyee(double s) { this("Employee #" + nextId, s); nextId++; }当调用new Employee(600)时,Employee(double)构造器将调用Employee(String, double)构造器。
import语句可以导入一个特定的类或者整个包。(应位于源文件的顶部但位于package语句的后面)
//导入java.util包中的所有类: import java.util.*; //导入特定的类: import java.util.Date;类设计技巧: ·保证数据私有 ·对数据初始化 ·不要在类中定义过多的基本类型 (比如:int,double,String等等,应该用其他的类代替这些基本类型的使用)
继承: Java用关键字extends代替了C++的冒号(:),Java里所有继承都是公有继承。
阻止继承: 声明为final类或者方法。
final class Manager{ } //不能定义Manager的子类。 class Employee { public final String getName(){ } //子类不能覆盖这个方法。 }在类型转换之前先看一下能否进行转换(使用instanceof运算符):
Manager boss; if(staff[1] instanceof Manager) { boss = (Manager) staff[1]; }一般情况下,应当尽量少用类型转换和instanceof运算符。
抽象类: ·包含一个或多个抽象方法的类本身必须被声明为抽象的。 ·抽象类不能被实例化,但能创建一个具体子类的对象。 如:Person p = new Student();
abstract class Person { public abstract String getDescription(); //等同于C++的纯虚函数。 }所有类的超类:Object。 ·重要方法:toString。用于返回对象值的字符串。绝大多数的toString方法遵循这样的格式:类的名字,随后是一对方括号括起来的域值。建议为自己定义的每一个类增加toString方法。 如:Employee类
public String toString() { return getClass().getName() + "[name=" + name + ",salary=" + salary + "]"; }只要对象与一个字符串通过"+"连接起来,Java编译就会自动调用toString方法。
如:调用 x.toString() 时可用 ""+x 代替。 如果x是对象,System.out.println(x); 会自动调用x.toString()方法。泛型数组列表: 可以在运行时动态改变数组大小。 ·下面声明和构造一个保存Employee对象的数组列表。
ArrayList<Employee> staff = new ArrayList<>(); 注意:尖括号内的类型参数不允许是基本类型!·add方法可以将元素添加到数组列表中:
staff.add(new Employee("Harry",...));·求数组列表包含的实际元素数目:
staff.size(); //等价于数组a的a.length。确认数组列表不再发生变化后,可调用trimToSize方法。将自动回收多余的存储空间。
·替换数组列表内容:
staff.set(i,harry); //等价于数组a: a[i]=harry;·获取元素:
staff.get(i);包装器: 所有的基本类型都有一个与之对应的类,这些类称为包装器(wrapper)。
如:Integer, Long, Double, Float, Character, Boolean...对象包装器类是不可变的,也不可以定义他们的子类。
接口:对类的一组需求的描述。
例:使用Arrays类的sort方法对Employee对象数组进行排序,Employee类必须实现Comparable接口。 //Comparable接口的代码: public interface Comparable<T> { int compareTo(T other); } 调用x.compareTo(y)时,当 x < y,返回一个负数;当 x > y,返回一个正数;否则返回0。·接口中的所有方法自动地属于public,因此在接口中声明方法时不必提供关键字public,但在实现接口时,必须提供public。
为了让类实现一个接口,两个步骤: 1)将类声明为实现给定的接口。(使用关键字:implements) 2)对接口中的所有方法进行定义。
class Employee implements Comparable<Employee> { public int compareTo(Employee other) { return Double.compare(salary,other.salary); } }所有数组类型都包含一个clone方法,可以利用这个方法创建一个包含所有数据元素拷贝的一个新数组。(深拷贝)
int[] Num = { 2,3,5,5,7,11}; int[] cloned = Num.clone(); cloned[5] = 12; //不改变Num[5]TreeMap获取键值:
Iterator<Phone> iter = treeMap.keySet().iterator(); while (iter.hasNext()) { iter.next().print(); }输入多行字符串:
while (true) { String s = input.nextLine(); if (s != null && s.equals("end")) break; }