开篇:学Java两年多了,知识长进了很多,最近忙着找工作,把基础又重新看了一下,发现了很多自己觉得比较隐蔽的知识点,有的是曾经看过但没记住的,有些是从来都不知道的,索性写一篇这样的博客备忘吧。
- 变量名:在Java中,变量名以下划线、字母、$符号开头,并且后跟下划线、字母、$符号以及数字。总之,Java中的变量名不能以数字开头,不能使关键字。
- Java原生数据类型在32位机中所占内存大小:byte字节、boolean(1个字节)、char(2个字节)、short(2个字节)、int(4个字节)、float(4个字节)、long(8个字节)、double(8个字节)
- Java中的所有浮点类型默认情况下都是double。不能将double类型的值赋给float类型的变量,即便该double类型的值处于float类型的范围内也是不可以的。比如有如下表达式:float i = 1.2;由于1.2默认在Java中是double类型所以如此赋值相当于向下转值,JVM会认为有精度损失。所以需要这么声明:float i = 1.2f;
- 这是一道面试题:Java中switch语句的default是不是必须的,答案:不是必须的。不写不会有语法错误,相当于if。。。else中的else
- 构造方法重载时:有参的构造方法可以通过this()调用无参的构造方法,但是this()必须是此构造方法的第一跳语句 “Constructor call must be the first statement in a constructor”
- 在继承关系中:要想生成子类的对象,首先要生成父类的对象,这是因为在子类的构造方法中隐式的调用了super()方法,也就是父类的构造方法。与this一样,super也必须要作为构造方法的第一条执行语句,前面不能有其他可执行语句。
- 在子类对父类的方法重写时:可以通过super.XX()的方式来调用父类的方法。同时并不必须是第一条语句。
- 在定义一个类的时候,如果没有显式指定该类的父类,那么该类就会继承于java.lang.Object类
- 在声明接口的时候abstract关键字可加可不加,因为接口interface本身是抽象的。
- 接口中可以有成员变量,但接口中的属性会被默认的声明为public static final类型的。
- Java中可以同时实现多个接口,但如果在被实现的多个接口中有相同变量名的变量的话,则会在编译是出错,因为这相当于在同一个类中声明了两个同名的变量。
- 当父类中某一变量为静态时,其所有子类中的该属性都指向同一位置,当一个子类修改这个属性的时候,其他子类看到的置也会改变;但如果这个父类的变量不是静态的那么,他们会享有各自的空间,相互没有影响。
- static方法和final方法只能继承,不能重写(Override)
- final类型的成员变量可在构造方法中为其赋初始值,前提是该变量没有没赋值过。
- 如果某个类中有静态代码块,那么当该类被实例化时,先执行该静态代码块,再执行构造方法。如果在继承关系中出现静态代码块,那么先执行顶层的静态代码块,再依次执行底层的静态代码块,再执行顶层的构造方法,再依次执行底层的构造方法。
- protected 所修饰的属性和方法可以在类内部、相同包以及该类的子类所访问。除接口以外的默认的(不加任何访问修饰符)的属性和方法可以在类内部以及相同包下面的所使用。接口的属性和方法默认是public的。所以如果不加修饰符那么其限定会比protected修饰更严格。
- java.lang包在使用的时候无需显式导入,编译由器自动帮我们导入。
- 字符串缓冲池的问题:这是一个经典面试题,这里只说一个结论 String a = "aaa",String b="aaa",String c = new String("aaa"),Stirng d = new String("aaa"); a==b(true) 、a.equals(b)(true)、c==d(false)、c.equals(d) true
- 已知I为接口 (interface I),有如下声明 I[] i = new I[10],这样是可通过编译的,以为建立的数组是一个由类似于指向I类型的指针组成的集合,并没有实例化I
- 每个枚举的成员其实就是您定义的枚举类型的一個实例
- Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor),当访问某个对象的synchronized方法时,表示将该对象上锁,此时其他任何线程都无法再去访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者是抛出了异常),那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。
如果一个对象有多个synchronized方法,某一时刻某个线程已经进入到了某个synchronized方法,那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的。