java遇见的问题分析
下面就一些java的一些基本问题进行解释。其中蓝色部分为handsomecui的主观看法
synchronized的参数代表的是“对象锁”代表的是不同的线程在synchronized块里,
同时只有一个线程能执行该代码块,而类的不同实例之间是互不影响的。
比如Person A = new Person(),Person B = new Person().A和B之间是不受synchronized制约的。
有三种方式可以用来创建线程:
1.继承Thread类
2.实现Runnable接口
3.应用程序可以使用Executor框架来创建线程池
三. ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
static方法跟类的任何实例都不相关,所以概念上不适用。
四.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。
当类被Java虚拟机载入的时候,会对static变量进行初始化。
如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
(注意,非static变量是实例化后才被创建,而static变量是类创建时就被创建)
五.
int 是基本数据类型
Integer是其包装类,注意是一个类。
为什么要提供包装类呢???
1.为了在各种类型间转化,通过各种方法的调用。否则 你无法直接通过变量转化。例如int x = Integer.valueOf("66");
2.泛型 List<Integer> nums;
这里<>需要类,要用Integer
六.Java中intValue,parseInt,Valueof 这三个关键字的区别?
int a = Integer.parseInt("123");(相当于把“123”转化为基本数据)
Integer b = Integer.valueOf("123");(相当于把“123”转化为一个Integer对象)
int c = b.intValue();(将123的对象表示形式转化为基本数据123)
也就是 Integer.valueOf("123").intValue() 等价于 Integer.parseInt("123")
七.java不支持多继承,但可以实现多个接口。
八.synchronized用在方法上级别是粗粒度锁,用在代码块上是细粒度锁。
九.Java集合类框架的基本接口有哪些?
- Collection:代表一组对象,每一个对象都是它的子元素。
- Set:不包含重复元素的Collection。
- List:有顺序的collection,并且可以包含重复元素。
- Map:可以把键(key)映射到值(value)的对象,键不能重复。
ArrayList和 LinkedList 实现了List接口,HashSet实现了Set接口,这几个都比较常用;
HashMap 和HashTable实现了Map接口,并且HashTable是线程安全的,但是HashMap性能更好
java.util.Collection [I]
|—java.util.List [I]
|—java.util.ArrayList [C]
|—java.util.LinkedList [C]
|—java.util.Vector [C]
|—java.util.Stack [C]
|—java.util.Set [I]
|—java.util.HashSet [C]
|—java.util.SortedSet [I]
|—java.util.TreeSet [C]
java.util.Map [I]
|—java.util.SortedMap [I]
|—java.util.TreeMap [C]
|—java.util.Hashtable [C]
|—java.util.HashMap [C]
|—java.util.LinkedHashMap [C]
|—java.util.WeakHashMap [C]
十.接口和抽象类的区别是什么?
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
- 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
- 类可以实现很多个接口,但是只能继承一个抽象类
- 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
- 抽象类可以在不提供接口方法实现的情况下实现接口。
- Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
- Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
- 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。