static (属性):
静态成员属于类本身的,而不是属于对象,被类的所有对象所共有.
即便不创建对象,也可以使用了类本身的今天成员 (私有成员不行)
static (方法) :
1. 在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法).而不能直接访问类中的非静态成员.
2. 静态方法不能以任何方式引用this和super关键字
3. 静态方法只能访问类的静态成员
继承
1. 代码得到极大的重用
2. 形成一种类的层次体系结构
3. 为多态创造条件
子类内部可以访问父类的非私有成员
通过子类对象名只能访问从父类继承过来的非私有成员.
总结 :
私有不能被继承
物理上已经被继承过来了,只不过逻辑上程序员不能去访问.
因此继承需要慎重,否则会浪费内存
多态
子类对象可以直接复制给父类引用,但父类对象在任何情况下都不可以直接付给子类引用. ( 狗可以当动物看,但是动物不能当狗看)
抽象类不能够new对象,但是可以定义一个抽象类型的数据,或者说指向一个抽象类的指针.
比如 :
A(抽象类)
A a; 正确
A a = new A(); 错误
final
final 修饰类 : 不能被继承
final 修饰属性 : 只能,必须赋一个值
final 修饰方法 : 该方法可以被子类继承,但是不能重写.
接口
定义 :
就是抽象方法和常量值的集合.从本质上讲接口就是一种特殊的抽象类
面向对象总结
封装
继承
多态
…
线程
定义 : 线程是一个程序里的不同执行路径.
以前编写的程序 :
一个入口,一个出口,一个顺序执行的序列.
过程中任何时刻只有一个单执的执行点.
单个程序内部是可以在同一时刻进行多种与运算的.这就是所有的多线程
使用 :
1. 创建一个继续Thread的类,并重写 fun() 方法好了
class A extends Thread{run(…){}}
2. 构造一个A类对象
A a = new A();
3. 调用a的start方法
a.start();这样它会自行调用run方法
注意 :
start() 方法的功能就是创建一个新的线程,并自动调用线程的run()方法,直接调用run() 方法是不会创建一个新的线程的
执行一个线程实际就是执行线程中的run()中的代码
执行完a.start()方法后,并不代表a所对象的线程就一定立即得到了执行,a.start();执行完后执行表示a线程具有了可以被立即被CPU执行的资格,但是由于想抢占CPU执行线程很多,CPU并不一定立即去执行a所对应的线程.
一个Thread对象,只能代表一个线程,
一个Thread对象,不能调用两次start()方法否则会抛异常
当然是实现Runnable接口的类也可以使用多线程.
线程的串行化
在多线程程序中,如果一个线程运行中要用到另一个线程的运行结果,则可进行线程的串行化处理.
Synchronized
Synchronized(参数)
{
表示如果当前线程能占有Synchronize(this)括号里的参数,那么就可以执行内部的代码,如果不能那么内部代码就不执行,而且该参数只能被一个线程占用.
当Synchronize 中的代码执行玩后就是否对该参数的占有.
如果A线程占有了该线程,那么BCD就不能占有,只能等A线程执行完后.ABCD再次同时竞争
}
Synchronized 修饰代码块
格式 :
Synchronized(类对象名 aa)
{ }
功能 :
Synchronized(类对象名 aa) 的含义是 :
判断aa是否已经被其他线程霸占,如果发现已经被其他线程霸占,则当前线程陷入等待中,如果发现aa没有被其他线程霸占,则当前线程就霸占住aa对象,并执行代码块…执行完后会自动是否对aa对象的霸占,此时其他线程会相互竞争对aa的占有,最终CPU会选择其中的某一个线程执行.
最终导致的结果是 :
一个线程正在操作某资源的时候,将不允许其他线程操作该资源,即一次只允许一个线程处理该资源.
this.wait();暂停该线程 this.notify()恢复该线程
this.notify() 功能 :
不是叫醒正在执行this.notify()的当前线程,而是叫醒一个现在正在wait this对象的其他线程,如果有多个线程正在wait this 对象.
通常是叫醒最先wait this对象的线程,具体叫醒哪一个,有系统调度器控制,程序员无法控制
假设有 T1,T2,T3,T4四个线程
T4 ->>aa.notify()语句
即便T1,T2,T3没有一个线程因为wait aa对象而陷入阻塞状态,T4线程执行aa.notify()方法时不会有任何错误
总结 :
aa.wait()
将执行aa.wait()的当前线程转入阻塞状态,让出CPU的控制权
释放对aa的锁定.是否对aa的Synchronized霸占
IO流
如果有一个类,这个类专门是用来把一个设备的数据和我们当前的程序进行数据的传输那我们这个类就叫 : 流
节点流和处理流
原始流 :
可以从一个特定的数据源(节点)读写数据(如 文件,内存)
包装流 :
是连接在已存在的流(节点流或包装流)之上通过对数据的处理为程序提供更为强大的读写功能
流就是程序和设备之间嫁接起来的一根用于数据传输的管道,这个管道上有很多按钮,不同的按钮可以实现不同的功能
这根带按钮的用于传输数据的管道就是流.
TClient.java
TServer.java