1.JDK JRE JVM 各自的作用和关系

JDK包含jre和开发工具包,作用是java程序的开发环境
jre包含jvm和核心类库, 作用是java程序的运行环境
jvm是java虚拟机,保证java语言跨平台。

2.java中的数据类型有那些

基本数据类型(4类8种):整型:byte,short,int,long       
浮点型:float,double
字符型:char         布尔型:boolean
引用数据类型:数组、类、接口

3.类型转换

隐式转换:小的转大的:(byte short char ) ->int ->long -> float ->double
byte \ short \ char 这三种数据类型发生数学运算时,会自动提升为int类型 
强制转换:大的转小的:(可能会造成数据的丢失)
整数类型直接写会默认为int                          
 小数类型直接写默认为double
常量优化机制  
两常量运算之后 可以先对比是否在数据类型的范围内 如果在就自动赋值 不在就会报错

4.java中的运算符

Ø 算术运算符  (+ - * / %    ++    --)自增和自减运算符只能用于操作变量,不能直接用于操作数值或常量 
Ø 赋值运算符(=    +=   .....)
Ø 比较运算符(>   <  >= .......)
Ø 逻辑运算符(与,或,非)   短路的,如果左边已确定,右边就不判断了
Ø 条件运算符(三元运算符)

5.数组

数组的初始化
1.动态初始化   : 在不明确每个元素具体值的时候使用		数据类型 [] 数组名 = new 数据类型[长度]; 
2.静态初始化   : 明确了每个元素具体值的时候使用		数据类型 [] 数组名 = new int{值1,值2....}		数          据类型 []     数组名 = {值1,值2...}	
区别:动态初始化需要指定数组长度的,但是没有数组里面具体的每个元素	
静态初始化不需要指定数组的长度,但是要明确的给出 每个元素的值

6.方法重载和重写的区别

方法重载规则(overload):
		在同一个类中 方法名相同但是参数列表不同就构成了方法的重载 
		参数列表不同 : 数据类型不同 或者 参数个数不同 或者参数顺序不同	
		可以抛出不同的异常,可以有不同修饰符
方法重写规则(override):在继承关系中,子类方法和父类方法名称相同,参数列表也相同,
	子类在重写父类方法时,权限必须大于或者等于父类方法的权限。    
	 构造方法不能被重写,声明为final的方法不能被重写,声明为static的方法不能被重写,
	子类抛出的异常类型不能大于父类

7.成员变量和局部变量的区别

1、在类中的位置不同
成员变量:在类中方法外面
局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中)

2、在内存中的位置不同,可以看看Java程序内存的简单分析
成员变量:在堆中(方法区中的静态区)
局部变量:在栈中

3、生命周期不同   
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用或者代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失

4、初始值
成员变量:有默认初始值
局部变量:没有默认初始值,使用之前需要赋值,否则编译器会报错(The local variable xxx may not have been initialized)

8.静态变量和实例变量

静态变量前要加static,而实例变量不需要。

在程序运行时的区别:实例变量属于某个对象的属性,只有在创建了对象后,实例变量才会被分配空间。
静态变量不属于某个对象,而是属于类,因此也被称为类变量。
在类的加载过程中,静态变量就被分配了空间,并可以通过类名的访问。
而实例变量必须在通过创建好的对象来访问。

9.==号和equals的区别

==号对于基本数据类型来说,比较的是值,对于引用数据类型来说比较的是地址值

equals方法在object类中,比较的是地址值,但是String类重写了Object类中的equals方法,所以常用来					   比较字符串的具体值;如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;而String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。其他的一些类诸如Double,Date,Integer等包装类,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。equals方法不能作用于基本数据类型的变量

10.什么是类

什么是类,类就是对象的抽象,对象是类的实例。
举个例子:猫就是类,而布偶猫、波斯猫、短毛猫、狸花猫就是猫这个类里具体的对象。
而猫的性别、体重、长度等就是这个对象的属性,猫会跑,会抓老鼠就是这个对象的方法。
总之类就是有相同特征的事物的集合,而对象就是类的一个具体实例

11.String,StringBuilder,StringBuffer之间的区别

String是字符串常量,而StringBuffer和StringBuilder是字符串变量。
由String创建的字符内容是不可改变的,而由StringBuffer和StringBuidler创建的字符内容是可以改变的。

用String创建字符串时:双引号创建是存储在字符串常量池中,
并且如果常量池中已经存在了内容相同的字符串就不会创建新的,直接完成赋值。
new创建字符串是存储在堆内存中.而且是每new一次就开辟一块新的地址值

通过源码可以知道。String、StringBuffer和StringBuilder都是final类,
它们生成的对象都是不可变的,而且它们内部也都是靠char数组实现的,
但是不同之处在于,String类中定义的char数组是final的,所以只能初始化一次。
而StringBuffer和StringBuilder都是继承自AbstractStringBuilder类,
它们的内部实现都是靠这个父类完成的,而这个父类中定义的char数组只是一个普通是私有变量,
可以用append追加。    
 
String类字符串拼接的时候,每拼接一次都是创建StringBuilder对象
,然后调用两次append方法进行拼接,最后在调用toString方法转换称String类型字符串,
所以String操作字符串的效率很低。

通过源码也可以看出区别。对于String, 凡是涉及到返回参数类型为String类型的方法, 
在返回的时候都会通过new关键字创建一个新的字符串对象; 
而对于StringBuilder, 大多数方法都会返回StringBuilder对象自身。
但是String类的api更丰富。并且日常使用中大多数用的还是String字符串。	

StringBuffer是线程安全的,而StringBuilder是非线程安全的。
StringBuilder是从JDK 5开始的,为StringBuffer类补充的一个单线程的等价类。
它支持StringBuffer的所有操作,它的方法都没有被synchronized修饰。
因为它不执行同步,不会有线程安全带来额外的系统消耗,所以速度更快。

12.static关键字

在《Java编程思想》P86页有这样一段话: “static方法就是没有this的方法。
在static方法内部不能调用非静态方法,反过来是可以的。
而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。
这实际上正是static方法的主要用途。”

表示静态的,是一个修饰符,修饰成员变量,成员方法,编写static代码块来优化程序性能 。

特点:被这个类的所有对象共享使用,随着类的加载而初始化,优先于对象而存在,	

静态的随着类的加载而初始化,初始化早,静态不可以使用非静态的,静态只能访问静态

(静态不能调用非静态,因为静态初始化比非静态早,去掉用一个不存在的东西,肯定会报错)

非静态的创建对象之后才初始化,初始化晚,非静态可以使用静态的,

13.面向对象的三(四)大基本特征

继承、封装、多态、 (抽象)

(1)继承:子类继承父类,继承父类的非私有的属性和行为,只支持单继承,不支持多继承,可以多层
 继承。在继承中:子类中所有的构造方法默认都会访问父类中空参数的构造方法 ,

(2)封装:封装,封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,
同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
  代码实现(属性前+private。创建Get和Set方法提供外部使用 )

(3)多态:

实现多态的条件:
1.继承:必须要有子类继承父类的继承关系。
2.重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。
3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

14.抽象类和接口的区别?

抽象类和接口都不能被实例化,
单继承,多实现,接口可以实现多个,只能继承一个抽象类。
类只能单继承, 但是接口可以多继承。
抽象类是对事物的抽象,接口是对行为的抽象。
接口里面都是常量,
抽象类可以定义构造方法,接口不能定义构造方法。
在1.8中,允许接口中定义静态方法,1.9中,接口中的方法可以是private的

如果一个类使用了abstract关键字修饰,那么这个类就是一个抽象类。
抽象类可以没有抽象方法
一个类如果包含抽象方法,那么这个类必须是抽象类,否则编译就会报错
最关键的一点就是如果一个类是抽象类,那么这个类是不能被实例化的。
抽象类只能用其子类(该子类不能是抽象类)去创建新对象。