1 IO

打印

System.out.println()

输入

import java.util.Scanner;
Scanner in = new Scanner(System.in);
int a = in.nextInt();
in.close();

public static void main(String[] args)是程序的入口

2 类与包

构造函数与C++一样

成员访问权限默认都是friendly,同一个包内可以自由访问

public class必须单独一个文件

包是java对于类的一种管理机制,包的结构与文件目录的结构一致

文件第一行package xxx声明包,同时目录结构也要变为xxx/xyz.java

包下还可以有包,Display.led,文件结构Display/led

访问其他包里的对象需要import <package_name>.<class_name>或者每次都在前面加<package_name>. (有点类似namespace)

import <package_name>.*也是允许的,但是不推荐

类变量&类函数 static

static 一个类共用一个

与C++里的static不太一样

类函数 static 里没有this指针(与C++一样),可以单独调用,也可以通过对象调用

3 容器

import java.util.xxx

ArrayList类似vector

对象数组中每一个元素都是对象的管理者而非对象本身,也就是说你在创建数组之后还需要再创建每一个对象。

“对象管理者”的概念 (类似指针)

有序容器的迭代遍历

for ( X x : List ) {...}

HashSet 类似 Set

HashMap 类似 map 注意不能放int,必须放对象(包裹类型)Integer

4 继承&多态

extends

super

super()用于传递参数给父类构造器

执行顺序:父类构造、子类成员初始化、子类构造器

Constructor call must be the first statement in a constructor

super()必须写在构造器的第一行

不可以用多个super(),因为一个子类只能继承一个父类

同名成员

同名成员对象

对于同名对象,父子类没有任何联系,在父类的方法中操作的就是父类的哪个,在子类的方法中操作的就是子类的哪个。

同名成员函数

同名成员函数,子类使用的永远是自己的,但是通过super.f()使用到父类的函数

多态

@override最好写上

Object类 (root类)

  • toString()

    • 不重写直接输出AAA.XXX@xxxxxx

    • 前面是类名(AAA是包名,XXX是类名),后面是地址

    • package AAA;
      
      public class Main4 {
          public static void main(String[] args) {
              A a = new A();
              B b = new B();
              System.out.println(a);
              System.out.println(b);
              b.f();
          }
      }
      
      class A {
          int a = 0;
          int aa = 1;
      }
      
      class B extends A {
          int aa;
          void f() {
              a = 1;
              aa = 2;
              super.aa = 3;
              A aaa = new A();
              System.out.println(aaa);
          }
      }
      
  • equals()

使用StringBuffer来降低开销

5 抽象&接口

抽象

abstract

类似virtual

抽象类 –> 纯虚类

也不能产生对象

接口

interface

纯抽象类

  • 所有成员函数都是抽象函数
  • 所有成员变量都是public static final

implement

与class不同:

  • 类可以实现很多接口
  • 接口可以继承接口,但不能继承类
  • 接口不能实现接口

内部类

定义在类/函数的内部

内部类能自由访问包括私有成员在内的外部的全部资源

外部为函数时,只能访问函数中final的变量

匿名类

new的时候给出类的定义

可以继承某类,也可以实现某接口

(好处:不用起名字

6 异常

函数若想抛出自定义异常(系统自带的比比如数组越界不需要,因为它们太容易被触发)需要声明throws

一旦声明调用时就必须加上try

当覆盖一个函数的时候,子类不能声明比父类更多的异常

子类的构造函数函数中,必须声明父类可能抛出的全部异常

7 流

对象 串行化 输入到流

流 反串行化 读入到内存