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