简述 static 和 final 的用法
- static:润饰属性,办法,代码块
(1)动态属性:也能够叫类变量 类名. 属性名 来拜访
留神点:类变量在类加载时被创立并进行初始化的,类加载的过程是进行一次,也就是说类变量被创立只会被创立一次。
(2)静态方法:类名. 办法名 间接拜访
留神点:static 润饰的办法,不能间接拜访本类中的非动态成员(包含办法和属性)本类的非静态方法能够拜访本类的动态成员(包含办法和属性),能够调用静态方法。 -
final:润饰变量,类,办法
(1)润饰变量
被 final 润饰的成员变量就是常量,一旦赋值就不能扭转
润饰局部变量:润饰根本数据类型 -> 变量的值不能扭转
润饰援用 -> 援用只能指向固定的对象
润饰实例变量:默认值不失效,能够再赋值
(2)润饰办法:不能被子类笼罩
(3)润饰类不能被继承在一个 final 类中的所有的办法,默认都是 final 的 留神点:final 不能用来润饰构造方法。
抽象类和接口的区别
- 相同点
A. 都是抽象类,都不能实例化。
B.interface 实现类及 abstract class 的子类都必须要实现已申明的形象办法 - 不同点
A.interface 要用 implement 实现,abstract class 要用 extends 继承。
B. 一个类能够实现多个 interface,但一个类只能继承一个 abstract class。
C. interface 强调特定性能的实现,而 abstract class 强调所属关系。
D. 只管 interface 实现类及 abstrct class 的子类都必须要实现相应的形象办法,但实现的模式不同。interface 中的每一个办法都是形象办法,都只是申明的 (declaration, 没有办法体),实现类必须要实现。而 abstract class 的子类能够有选择地实现。
.sleep()和 wait()有什么区别
- Thread 类的办法:sleep(),yield()等
- Object 的办法:wait()和 notify()等
- 每个对象都有一个锁来管制同步拜访。Synchronized 关键字能够和对象的锁交互,来实现线程的同步。
- sleep 办法没有开释锁,
- wait 办法开释了锁,使得其余线程能够应用同步控制块或者办法。
- wait,notify 和 notifyAll 只能在同步控制办法或者同步控制块外面应用,而 sleep 能够在任何中央应用
- sleep 必须捕捉异样,而 wait,notify 和 notifyAll 不须要捕捉异样
有了根本数据类型,为什么还须要包装类型
- 咱们晓得 Java 是一个面相对象的编程语言,根本类型并不具备对象的性质,为了让根本类型也具备对象的特色,就呈现了包装类型(如咱们在应用汇合类型 Collection 时就肯定要应用包装类型而非根本类型),它相当于将根本类型“包装起来”,使得它具备了对象的性质,并且为其增加了属性和办法,丰盛了根本类型的操作。
- 另外,当须要往 ArrayList,HashMap 中放货色时,像 int,double 这种根本类型是放不进去的,因为容器都是装 object 的,这是就须要这些根本类型的包装器类了。
“==” 和 equals 办法到底有什么区别
== 操作符比拟的是值【变量 (栈) 内存中寄存的对象的 (堆) 内存地址】,也就是用于比拟变量所对应的堆内存中所存储的数值是否雷同。
equal 用于比拟两个对象的值是否雷同【不是比地址】
【特地留神】Object 类中的 equals 办法和“==”是一样的,没有区别,而 String 类,Integer 类等等一些类,是重写了 equals 办法,才使得 equals 和“== 不同”。对于根底数据类型来说,没有重写 equals 办法,故两者是一样。
String、StringBuffer 和 StringBuilder 的区别
- 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:
StringBuilder > StringBuffer > String
- 再来说线程平安
在线程平安上,StringBuilder 是线程不平安的,而 StringBuffer 是线程平安的
String:实用于大量的字符串操作的状况
StringBuilder:实用于单线程下在字符缓冲区进行大量操作的状况
StringBuffer:实用多线程下在字符缓冲区进行大量操作的状况
super 与 this 的区别
不同点:
1、super()次要是对父类构造函数的调用,this()是对重载构造函数的调用
2、super() 次要是在继承了父类的子类的构造函数中应用,是在不同类中的应用;this()次要是在同一类的不同构造函数中的应用
相同点:
1、super()和 this()都必须在构造函数的第一行进行调用,否则就是谬误的
char 型变量中能不能存贮一个中文汉字,为什么?
char 类型能够存储一个中文汉字,因为 Java 中应用的编码 Unicode(不抉择任何特定的编码,间接应用字符在字符集中的编号,这是对立的惟一办法),一个 char 类型占 2 个字节(16 比特),所以放一个中文是没问题的。
强制类型转换的注意事项
Java 在波及 byte、short 和 char 类型的运算时,首先会把这些类型的变量值强制转换为 int 类型,而后对 int 类型的值进行计算,最初失去的值也是 int 类型。因而,如果把两个 short 类型的值相 加,最初失去的后果是 int 型;如果把两个 byte 类型的值相加,最初也会失去一个 int 类型的值。如果须要失去 short 类型的后果,就必须显示地把运算后果转换为 short 类型。
常见的 RuntimeException(运行时异样)
(1)java.lang.NullPointerException 空指针异样,呈现起因:调用了未经初始化的对象
那个或者不存在的对象。
(2)ClassNoFoundException 指定类找不到,呈现起因:类的名称和门路加载谬误,通常是试图通过字符串来加载某个类时可能引发异样。
(3)NumberFormatException 字符串转换为数字异样,呈现起因:字符串数据中蕴含非数字型字符。
(4)IndexOutOfBoundsException 数组下标越界异样
(5)IllegalArgumentException 办法传递参数谬误
(6)ClassCastException 数据类型转换异样
(7)NoClassDefFoundExcetion 未找到类定义谬误
(8)SQLException SQL 异样
(9)InstantiationException 实例化异样
(10)NoSuchMethodExceptioin 办法不存在异样
字符串存储的机制是什么
字符串会存储在常量池中。在给字符串赋值的时候,JVM 会查看常量池中是否曾经存在该字符串,如果存在则间接援用该地址,否则会在常量池中创立该字符串而后援用该地址
GC 是什么? 为什么要有 GC?
GC 是垃圾收集的意思,内存解决是编程人员容易呈现问题的中央,遗记或者谬误的内存回收会导致程序或零碎的不稳固甚至解体,Java 提供的 GC 性能能够主动监测对象是否超过作用域从而达到主动回收内存的目标,Java 语言没有提供开释已分配内存的显示操作方法。Java 程序员不必放心内存治理,因为垃圾收集器会主动进行治理。要申请垃圾收集,能够调用上面的办法之一:System.gc()或 Runtime.getRuntime().gc(),但 JVM 能够屏蔽掉显示的垃圾回收调用。
垃圾回收能够无效的避免内存泄露,无效的应用能够应用的内存。垃圾回收器通常是作为一个独自的低优先级的线程运行,不可预知的状况下对内存堆中曾经死亡的或者长时间没有应用的对象进行革除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃
圾回收。
在 Java 诞生初期,垃圾回收是 Java 最大的亮点之一,因为服务器端的编程须要无效的避免内存泄露问题,然而时过境迁,现在 Java 的垃圾回收机制曾经成为被诟病的货色。挪动智能终端用户通常感觉 iOS 的零碎比 Android 零碎有更好的用户体验,其中一个深层次的起因就在于 Android 零碎中垃圾回收的不可预知性。
什么是双亲委派机制
双亲委派模式的工作原理的是; 如果一个类加载器收到了类加载申请,它并不会本人先去加载,而是把这个申请委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,顺次递归,申请最终将达到顶层的启动类加载器,如果父类加载器能够实现类加载工作,就胜利返回,假使父类加载器无奈实现此加载工作,子加载器才会尝试本人去加载,这就是双亲委派模式,即每个儿子都不违心干活,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子本人想方法去实现,这不就是传说中的双亲委派模式.