简述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 系统中垃圾回收的不可预知性。
什么是双亲委派机制
双亲委派模式的工作原理的是;如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,即每个儿子都不愿意干活,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己想办法去完成,这不就是传说中的双亲委派模式.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。