Java学习笔记

    科技2025-09-06  15

    关键字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; }
    Processed: 0.009, SQL: 8