java.2

12.30学习笔记

静态方法不能调用非静态的变量和非静态方法

使用引用变量调用静态方法,编译器还是不会识别是谁调用的静态方法

静态变量是共享的

静态变量在该类的任何对象创建之前(任何静态方法调用之前)就被初始化了

如果类只有静态方法,你可以将构造函数标记为private 避免其被初始化

java 常量是 static final int X=0;常量通常全部大写,必须赋值。

final 一旦赋值就不能修改,final类不能被继承,final方法不能被重写

静态初始化程序!

在加载类之前被调用
static{
x=100;
}
所谓类被加载的意思是,类第一次被使用的时候,包括第一次被创建或者第一次被调用静态方法

Math的一些方法

random() abs() round()四舍五入 min() max()

private 主数据类型的包装

Boolean
Character
Byte
Short
Integer
Long
Folat
Double
int i=100; Integer I=new Integer(i); int ii=I.intvaule();

autoboxing 自动的在主数据类型和其封装类之间做转换

String 转主数据类型

Integer.parseInt("1")
Double.parseDouble("1.11") new Boolean("true").booleanvalue();

'+'是java中唯一重载过的运算符

数字的格式化

String.foramt("%,d",10000000)
String.format("aha %,.2f ",1231111.1345)
String.format("%x",42) 16进制
String.format("%c",34)
%tc 完整日期
%tA %tB %td 星期几/月/日

Date()用来查看当前的日期,其他关于日期的功能去Calendar中找

Calendar c=Calendar.getInstance() c.set(2012,1,1,12,30);设定当前时间,注意月份是从0开始的
c.getTimeInMillis() 获得毫秒,返回long
c.setTimeInMillis(long t)设置时间
c.add(c.Date,35)日期加上35天
c.roll(c.Date,35)只有日期字段会变
c.set(c.Date,1)直接设置日期的值
DAYOFMONTH
HOUROFDAY

异常处理

异常时Exception类型的对象,所有的异常都是他的子类

你自己写的类如果可能会抛出异常,可以主动抛出异常 throw new Exception()

finally无论如何都会执行,即便是try/catch里面有return 也会执行,程序会先跳到finally,然后再执行return

当有多个一场抛出的时候,catch的顺序一定要是从小到大排列的,这样子对于特殊性的一场用特别的代码catch,而其他的那些异常就可以用通用的方法捕获

当你不想处理异常的时候,可以duck掉,直接将这个一场在方法声明后面抛出,然后就将异常交给调用者处理,如果谁都不解决这个一场,最后异常会交给main函数,main函数在交给jvm,jvm是不会管这个异常 的

这种写法也是合理的

void go() throws Exception(){  
   try{ 
   //代码  
   }
   finally{}  
}

对象的序列化

将对象序列化之后存入文件或者网络资源当中之后,方便下一次程序读取和恢复这个对象,序列化之后保存到文件就变得不可读了,不会被人为恶意的修改

序列化会把对象的实例变量所有引用的对象都给序列化,就是说将对象完整的保存下来。注意同一个类的不同对象之间的区别就在于实例变量的区别,所以只需要保存实例变量

要想类是可序列化的就要实现Serializable接口

public class x implements Serilaization{
    //balabala
}
x c=new x();
FileOutputStream f=new FileOutputStream("a.ser");
ObjectOutputStream os=new ObjectOutputStream(f);
os.writeObject(c);

然后就可以将类的实力通过ObjectOutputStream()转化成字节,进而保存下来

只有可实例化的类才能被实例化,但凡实例化的过程中有一个类不能被实例化,整个实例化过程就失败了,不可能只实例化一半

可以把某些实例变量标记为transient,这样子他就不会被实例化的时候存储下来了,目的是万一有些类被忘记标记成可实例化的,可以跳过保存其他的东西,或者是这个变量本来就是动态创建的,不需要保存

反序列化

  FileInputStream fi=new FileInputStream("a.ser");
  ObjectInputStream oi=new ObjectInputStream(fi);
  c=(father)oi.readObject();

反序列化之后,新的对象会被在堆上创建,他的构造函数不会被执行,我们要的是对象被保存的状态,构造函数要是被执行的,就重新初始化了。
如果对象的祖先类不可序列化,那么这个不可序列化的祖先以及他以上的类都会被执行构造函数
如果对象可序列化,他的所有子类肯定都可序列化
对象的实例变量会被还原,transient的变量会等于默认的值(null,0,0.1,false)
静态变量不会被序列化,记住静态变量是每个类一个,不是每个对象一个

FileOutputStream写入字节流 Filewriter写入字符流

File

File代表了文件的地址,而非位置,使用File比直接传入String路径要更加安全

File 可以是路径/文件
f.delete() 删除文件
dir.list() 返回路径下的文件名字String[]

缓冲区的使用

BufferWriter writer=new BufferWriter(new FileWriter(name));

这样你调用writer方法的时候数据写到缓冲区里,直到缓冲区满才写入文件,减少磁盘操作。
writer.flush()强制写入到磁盘

BufferReader  reader=new BufferWriter(new FileReader(name));
reader.readLine()一次读一行,返回String

sting.split("/")返回String[],把sting串分开按照‘/’分割

for(var x:xp) 这样遍历xp数组

Socket

端口号0-65535,其中0-1023都被已知的特定服务占据了

服务端

ServerSocket server=new ServerSocket(5555);
Socket thesocket=server.accept()
//这里accept()是阻塞的,当有socket连接的时候返回socket这样子就能通过这个socket完成通信了

客户端

Socket s=new Socket(ip,port)  
然后通过s的get方法获得inputstream和outputstram做必要的操作
原文地址:https://www.cnblogs.com/Coder-Pig/p/6243218.html