静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。
如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量
静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法
内部类的主要作用如下:
1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
问:内部类有几种呢?
答:内部类可分为以下几种:
成员内部类
静态内部类
方法内部类
匿名内部类
如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字
创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用,由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
父类的引用可以调用子类从父类继承或重写的方法,但不能调用子类独有的方法
包含抽象方法的类是抽象类,抽象类中可以包含普通方法也可以没有抽象方法,抽象类不能直接创建对象,可以定义引用变量
接口一般是public,不能是protected,private
接口里的方法只能是抽象方法,是public static系统会自动添加
接口里的属性是public static final 系统会自动添加
包装类主要提供了两大类方法:
1. 将本类型和其他基本类型进行转换的方法
2. 将字符串和本类型及包装类互相转换的方法
Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多批评,不建议使用,更推荐使用 Calendar 类进行时间和日期的处理。
Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用类名.方法名
集合框架主要是两大接口,collection和map
Entry是map的一个内部类
自定义注解
===============================================
// 下面四个称为元注解
@Target({ ElementType.METHOD, ElementType.TYPE}) // 注解的作用域
@Retention(value = RetentionPolicy.RUNTIME) // 注解的生命周期
@Inherited // 允许继承
@Documented // 可生成文档
public @interface DoAnnotation {
// 成员的类型受限,须为原始类型或String,Class,Annotation,Enumeration
// 如果只有一个成员,则必须名字为value,使用时可以忽略成员名和赋值号(=)
// 注解类也可以没有成员,那种称为标识注解
String desc(); //必须无参无异常
String author();
int age() default 18;
}
===============================================
===============================================
取字节的低八位的方法
例如,有个数字 0x1234,如果只想将低8位写入到内存中
将 0x1234 & 0xff
0x1234 表示为二进制 00010010 00110100
0xff 表示为二进制 11111111
两个数做与操作,显然将0xff补充到16位,就是高位补0
此时0xff 为 0000000011111111
与操作 1&0 =0 1&1 =1 这样 0x1234只能保留低八位的数 0000000000110100 也就是 0x34
===============================================
UTF-8编码中,中文日语汉字占三个字节,英文字母占一个字节
GBK编码中, 中文日语汉字占两个字节,英文字母占一个字节
shift_jis编码中,日语汉字占两个字节,英文字母占一个字节
java是双字节编码,是UTF-16be编码,中文日语汉字占两个字节,英文字母占两个字节
File类只用于表示文件或目录的信息,不能用于文件内容的访问
File file = new File("src\\main\\java\\xxxxxx\\yyyyyy\\zzzzzz\\app\\welcome\\Calculable.java");相对路径不是本类所在的路径,而是工程根目录
RandomAccessFile可以对文件进行读和写,可以访问文件的任何位置
RandomAccessFile rf = new RandomAccessFile(file,"rw");
经常用PrintWriter和BufferedReader配合使用读写文件
对象的序列化就是将对象转换成byte序列
序列化流ObjectOutputStream,是过滤流writeObject
反序列化流ObjectInputStream,是过滤流readObject
序列化接口Serializable,必须实现这个接口才能序列化,这个接口没有任何方法,只是一个标准
private transient String prefix;//transient修饰的变量不会被JVM默认序列化,可以做自己的序列化 (可参照ArrayList)
对子类对象进行反序列化时,如果父类没有实现序列化接口,那么其父类的构造函数会被调用
java8以后,接口可以拥有方法体
log.debug(ReflectionToStringBuilder.toString(对象)) ReflectionToStringBuilder是apach下打印对象内容(键值对方式)的类