在学习java过程中记录下了一些平时容易忽略的知识点,想分享给需要的童鞋。在记录的时候是按照自己的语言风格来做的,有什么不懂的希望和大家一起交流,有错误还请指出,会持续更新……
- java既是编译型语言又是解释型语言,java程序执行先编译后解释两步
- 类是java程序的最小程序单位
- public static void main(String[] args)
- 一个java源文件里最多一个public类
- java程序的内存分配和回收都是JRE在后台自动进行的,Garbage Collection,垃圾回收的缺点是增大了开销,要追踪程序中无用的对象并释放
- byte 1字节、short 2字节、int 4字节、long 8字节、char 2字节、float 4字节、double 8字节、boolean、1字节8位
- 二进制以0b、0B开头,八进制以0开头,十六进制以0x、0X开头
- 负数在计算机中以补码存放,补码减一得到反码,符号位不变其他位取反得到原码
- java语言默认的浮点类型是double类型
- 三个特殊的浮点数值:正无穷大、负无穷大、非数:POSITIVE_INFINITY、NEGATIVE_INFINITY、NaN
- 正、负无穷大和正、负无穷大相等,NaN不和任何数值相等,也不和NaN相等
- 浮点型数值运算会出现以上特殊值,浮点型数值可以做除0.0运算,整数型不能除0
- switch语句判断变量与case后的值相等以后执行对应的语句,如果没有break,继续执行后面语句,不在进行与case比较的判断,所以break不能省略
- Java中break语句可以直接跳出外层循环,需要使用标签,例如外层循环外有 outer: 标识符,并且使用break outer; 语句跳出
- continue再循环当中出现则忽略本次循环剩下的语句,继续开始下一次循环
- int是基本类型,而int[]是引用类型,定义数组时不能指定数组长度
- int num2=(int) (Math.random()*(900000)+100000);//取一个100000-999999的数字,999999-100000+1
- foreach循环不能改变数组元素的值,当用foreach迭代访问数组时,foreach的循环变量相当于一个临时变量,只是保存了数组元素的值而已【eg: for(int book:books) 】
- 实际的数组对象存储在堆中,如果数组引用变量是局部变量,那么它被存在栈中
- 所有在方法中定义的局部变量都是存放在栈内存中的
- 一个对象被创建的时候是存放在运行时数据区中,就是堆内存中
- 定义并初始化一个数组后,在内存中分配了两个空间,一个用于存放数组的引用变量(在栈中),一个用于存储数组本身(在堆中)
- static修饰的方法可以直接由类名调用,比如Arrays类中定义了一些static修饰的方法
- 类中static修饰的成员不能访问没有static修饰的成员(成员方法或者成员变量);有static修饰的成员属于类本身,没有static修饰的属于该类的实例
- 构造器用于构造一个类的实例,是一个类创建对象的根本途径,java使用new来调用构造器
- 程序员不写构造器,则系统默认构造器,如果程序员写了则系统不再提供
- 成员变量和属性不同,类有age属性,则说明有关于age的set和get方法
- 把一个对象的所有引用变量赋值为null,则该对象变为垃圾对象
- this,谁调用这个方法,this就指代谁
- java可以定义参数个数可变的方法,比如:public void test(int a,String ... books)多个参数被当成books数组传入,但是这种个数可变的形参只能位于参数列表的最后,一个方法只能包含一个这样个数可变的参数
- 成员变量可以不用显示的初始化,在创建对象时会默认初始化,但是局部变量(除了形参以外)都需要显示的初始化,否则不能够访问
- import和import static的功能非常像,import可以导入某一个类而省略写这个包名,import static可以导入一个类的成员变量或方法而省略写出这个类名
- java中一个类只能有一个直接父类,可以有很多个间接父类
- super关键字用语在子类中访问父类中被覆盖的方法或者成员变量
- 在一个构造器中调用该类的其他构造器使用this来实现,在子类中调用父类的构造器使用super来实现
- 调用子类构造器初始化子类对象的时候,父类构造器总会在子类构造器执行之前执行,以此上溯,所以所有的对象创建的时候最先执行的都是java.lang.Object类
- 子类继承父类发生多态时,子类覆盖了父类的方法则执行子类的方法,如果没有覆盖则执行父类的方法,父类中没有的方法子类中有也不能执行;注意只执行父类的成员变量。
- instanceof是java提供的运算符,用于判断一个对象是否是一个类或者该类的子类,if(obj instanceof String)返回true 或者 false
- java创建对象时,有初始化块先执行初始化块中的语句,再执行构造器;初始化块与声明实例变量指定默认值都是初始化代码,执行顺序与程序的顺序一样
- 类初始化阶段会执行静态初始化块,从父类到子类,对象初始化阶段先执行最顶层父类的初始化块和构造器,然后向下到子类的普通初始化块和构造器
- 当程序第一次创建一个对象时(比如Leaf类),系统中还没有Leaf类,要加载这个类并初始化Leaf类,执行静态初始化块,第二次创建这个对象时,因为虚拟机已经加载了该类,所以不用再初始化
- JVM第一次使用类的时候,在类的准备阶段,为所有静态成员变量分配内存;在类的初始化阶段,初始化这些静态成员变量,为他们赋初值
- 基本数据类型int与包装类Integer,char与Character……
- 所有对象都有toString()方法,直接打印一个对戏那个p和打印p.toString()是一样的,它返回的是这个对象的实现类的“类名+@+hashcode”
- 当java程序直接使用“hello”,“你好”这样的字符串直接量时,JVM会直接使用常量池来管理这些字符串,这样的字符串在编译时就能够确定下来,所以直接使用常量池中的就可以;当使用new关键字创建新的字符串对象时,这个字符串会被保存在运行时数据去中就是堆内存中
- Object提供的equals()方法比较的是引用,String重写了equals()方法,比较的是字符串序列
- 写一个单例类Singleton——1、定义一个稀有静态缓存对象;2、隐藏构造器;3、使用getInstance()方法获得Singleton对象;4、判断缓存中是否有Singleton对象,没有创建,有就返回
- final修饰类、变量、方法,用final修饰则不可改变;final修饰的成员变量必须由程序员显示指定初始值;final修饰的局部变量如果在定义时没有指定初始值,则可以在后面赋值一次,不能重复赋值;在final修饰形参时,由调用者传入的参数来完成初始化,此外不能够再次赋值;final修饰引用类型的变量时,只能保证该变量的引用不变(可以理解为地址不变),但是不能保证其指向的对象的内容不变;
- final修饰的方法不可重写;但是在父类中定义的private方法,在子类中本就不可见,所以子类可以重新定义方法名、形参、返回类型的方法,这不是重写;所以final修饰的private方法在自类中依旧可以写一样方法名、形参、返回类型的方法
- final修饰的方法不能被重写,但是可以被重载(参数列表不同)
- final修饰的类不能有子类
- final修饰的变量赋值时直接变成直接量(单纯的基本数据、算术表达式,在编译时就确定下来,没有访问普通变量,没有使用方法)时,final变量变成宏变量,程序在运行时直接找到该变量;final String a=“变量”+“1”;final String b=“变量1”;final String c=“变量”+String.valueOf(1);其中a==b;但是b!=c;“变量1”存在常量池中「p178」
- final修饰的实例变量只有在定义该变量时指定初值才有宏变量的效果
- 缓存实例「p184」
- Integer只能缓存-128~127之间的数
- static和abstract不能同时修饰方法,因为类不能调用一个没有方法体的抽象方法;但是可以同时修饰内部类
- 接口中使用default修饰默认方法,默认方法不能使用static修饰,所以不能用接口直接调用默认方法,应该用接口的实现类的实例来访问默认方法
- 接口中使用static来修饰类方法,不能使用default来修饰,接口可以直接调用类方法
- 接口里的成员都是public、static、final的
- 类实现接口的时候应该重写接口中全部的抽象类,否则实现类还是抽象类,因为继承了接口中的抽象方法
- 实现类的方法都是public,实现类中的方法访问权限必须大于等于接口中的方法