【读Java:A Beginner’s Guide后对基础概念的整理,已熟练掌握的不展开,仅提一下,都写在纸质笔记本上。基础不牢,地动山摇!】
ch7 继承
Java不支持多重继承(一个子类多个超类)
子类可用访问器来访问类的私有成员
-
调用超类构造函数
super(w,h); -
子类成员名隐藏了超类的同名成员
super.member
按继承顺序来调用构造函数
<超类引用可以引用子类对象>
X x;//超类
Y y;//子类
x=y;
但是赋之后,x的类型还是X
超类构造函数:A(A ob)
子类:B(int a)
B(B ob){super(ob);}
在主函数中 B ob1=new B(int a);
B ob2=new B(ob1);
方法重写
子类方法与超类方法具有相同返回类型和签名时会重写
不一致就是方法重载
方法重写→动态方法分配→多态性
- 创建超类和子类对象
- 再建一个超类对象
- 将子类赋给超类再调用方法
占位符
如果要创建多个对象
A ob[]=new A[5];
ob[0]=new B(10);//超类引用可以引用子类对象
抽象类abstract
只适用于实例方法,子类必须要重写
final
防止被重写或者类的继承
ch8 包和接口
命名类:namespace中分配一个名字
包.类名 避免冲突
protected 对所有子类可见,对不同包的非子类不可见。
导入:
import package.calssname;
import package.*;
标准类类库:API 存在包里顶部是java
下面是子包
java.lang(自动导入)包含System
实现接口用implements
接口引用
- 创建类的对象ob1
- 接口名 ob;
- ob=ob1;
定义共享常量,定义一个无方法接口。
接口可拓展
默认方法/拓展方法
加上default修饰符
如果B接口继承了A,用A中的reset方法:
A.super.reset();
static接口方法不可被类或子接口继承,但不需要实例对象
私有接口方法:允许多个默认方法使用多个代码段
ch9 异常处理
异常类throwable 有两个子类:Error、Exception
- Exception:程序活动导致:除0、数组越界、文件错误
- Exception有子类:RuntimeExecption
- Error发生在虚拟机中
异常产生条件
- 内部错误,虚拟机异常
- 标准异常:除0等
- 手动产生的异常:throw产生
常见异常
ArrayIndexOutOfBoundsException
ArithmeticeException 处理除0异常
IOException
FileNotFoundException
NumberFormatException
InterruptedException(多线程Thread)
try catch finally
如果想捕捉超类和子类异常,把子类异常放前面,把超类(Throwable)放在后面
手动抛出异常:创建异常后抛出,throw new name();
重新抛出异常:允许多重程序访问异常 throw exc;
finally的作用:异常使方法提前返回,但是已经打开文件或者网络连接,finally可以退出代码块
Throwable 定义的方法:
名称 | 描述 |
---|---|
void printStackTrace | 显示错误信息以及方法调用 |
String toString | 返回字符串 |
throws:无法处理/自己不做处理,从main()抛出。
RuntimeException的子类都不必指定
如果throws了必须处理该异常
多重捕获
在异常名称们之间加|
可以创建异常子类
如果方法中调用了异常,方法名加throws,方法内部用throw并创建对象。
ch10 I/O
流是产生信息的抽象
- 字节流
InputStream、OutputStream - 字符流
- Reader、Writer
- 预定义流:In out err
字节流
int read(byte data[],int start,int end)throws IOException
读取字节数组
控制台输入输出 read write/println/printf/format
字节流读写文件
FileInputStream fin=new FileInputStream(args[0]);
i=fin.read();
fin.close();
打开文件的时候注意FileNotFoundException
读和关闭注意IOException
fin可初始化为null 最后如果fin不为null则为成功打开
FileOutputStream fout=new FileOutputStream(args[0]);
i=fout.write();
FileOotputStream(String filename,boolean append)
append==true 则添加到文件的结尾
自动资源管理try with resources
try(FileOutputStream fout=new FileOutputStream(args[0]){
...
}catch{...}
读写二进制数据
try(DataOutputStream dataout=new DataOutputStream(FileOutputStream("..")){
dataout.writeInt();
dataout.writeBoolean();
}catch{...}
随机访问
RandomAccessFile(String name,String type)
“r” “w” “rw”
寻找指针
seek(long pos)
注意double为8字节
java字符流
BufferedReader br=new BufferedReader(InputStreamReader(System.in)
注意读的都是Int类型
读取字符串
br.readline();
控制台输出
PrintWriter pw=new PrintWriter(System.out,true);//true为刷新
pw.println();
字符流文件
FileWriter fw=new FileWriter(System.out,true);
BufferedReader br=new BufferedReader(FileReader("...")
类型封装器
n=Integer.parseInt(str);
NumberFormatException
ch11 多线程
多任务
- 基于进程
- 基于线程
创建线程
- 实例化Thread对象
- 实现Runnable接口
注意InterruptedException
实现Runnable流程:
-
创建MyThread implements Runnable的时候,引用线程。
-
Thread thrd;
-
构造函数创建Thread对象
MyThread(String name){
Thrd=new Thread(this,name);} -
静态工厂方法
public static MyThread createAndStart(String name){
MyThread myThrd=new MyThread(name);
myThrd.thrd.start();
return myThrd;}
- public void run();
- 主函数中再建一次对象
MyThread mt=MyThread.createAndStart("…");
可以直接用thrd.getName();
拓展Thread
- 用super(name)
- 直接getname()
- 主函数中建了MyThtread对象mt后,mt.start();
确定线程何时结束的方法
- boolean isAive()
比如mt.thrd.isAlive() - mt.thrd.join();
设置优先级
mt.thrd.setPriority(Thread.NORM_PRIORITY);
NORM_PRIORITY
MIN_PRIORITY
MAX_PRIORITY
同步:只能一个线程共享资源/等另一个线程所以要挂起
-
在方法前加synchronized
调用名称 Thread.currentThread().getName() -
syn代码块
synchronized(ob){}
线程通信
wait() notify()
wait(long ms,int ns)
当另一个不运行,wait()
ch12枚举、自动装箱、静态导入和注解
枚举enum A{a,b,c,d}
自我类型化,自我:枚举常量的枚举
A tp;
tp=A.a;
枚举是类类型
获得A常量数组
A aa[]=a.values();
for(A i:aa)//foreach
tp=A.valueof("a");
可有构造函数
自动继承java.lang.Enum;
获取位置
tp.ordinal();
常量间比较
tp.compareTo(tp1);
自动装箱/拆箱
Integer iob=new Integer.valueOf(100);
int i=iob.intValue();
Integer iob=100;
int i=iob;
静态导入
导入静态成员
import static java.lang.Math.*;
然后可以直接引用静态成员名
ch13 泛型
Gen<T>{
Gen(T ob){
...}}
Gen<String> ob=new Gen<String>("SCDCS");
ob.getClass().getName();
约束类型
class Gen<T extends Number>
通配符实参
Gen<?> ob;
约束通配符
Gen<? extends A>
泛型方法
static <T extends Comparable<T>,v> boolean aequal(T[] X,V[] Y){..}
菱形运算符
擦除
ch14 lambda
函数式接口
- interface MyValue{double getValue();}
- MyValue myval=()->98.6;
- myvalue.getValue();
测试是否是子串
a.indexOf(b)!=-1;
块lambda必须用return
方法引用
类::方法名→接口名 对象名
构造函数引用