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 流
对象 串行化 输入到流
流 反串行化 读入到内存