Java基础知识

1.跨平台原理
* 只要在需要运行java应用程序的操作系统上,先安装一个Java虚拟机(JVM Java Virtual Machine)即可。
由JVM来负责Java程序在该系统中的运行。


2.jvm、jre和jdk的关系
jvm为java虚拟机
jre为jvm + 核心类库
jdk为java开发工具 + jre
jdk > jre > jvm   巧记:d > r > v


3.标识符
在java中,用来给类、接口、方法等命名的字符序列
构成: 
* 英文字母大小写
* 数字
* $和_ 下划线
注意事项:
* 数字不能开头
* 区分大小写
* 不能用关键字
常见标识符命名规则:
* 包名:全部小写
* 类名:每个单词的首字母大写
* 变量名和方法名:第一个单词字母小写,以后每个单词的首字母大写
* 常量:全部使用大写字母,单词间用下划线隔开


4.关键字
在java中被赋予特殊含义的英文单词
所有关键字都为小写字母


5.常量
解释:在程序执行过程中其值不可发生改变的量。
分类: 字符串常量:"a"
整型常量: 9
小数常量: 0.9
字符常量: 'a'
布尔常量: true和flase
空常量: null


6.变量
解释:在程序执行过程中,在一定范围内其值可以发生改变的量。
定义格式:数据类型 变量名 = 变量值;
为什么要定义变量:用来不断的存放同一类型的常量,并可以重复使用 。
注意事项:
局部变量在使用之前必须赋值
   赋值时,不能超出该变量的数据类型的范围
   在同一个{}号内,不能重复定义相同的变量名


7.数据类型
分类:基本数据类型和引用数据类型
基本数据类型包括:(4类8种)
整数型:byte、short、int、long
浮点型:float、double
字符型:char
布尔型:boolean


8.运算符
分类:
算术运算符:+,-,*,/,%,++,-- 
赋值运算符:=,+=,-=,*=,/=,%=
比较(关系)运算符:==,!=,>,>=,<,<= 
逻辑运算符:&,|,^,!,&&,|| 
位运算符:&,|,^,~ ,>>,>>>,<<
三元运算符:(关系表达式) ? 表达式1 : 表达式2;


9.算术运算符注意事项:
* a:+号在java中有三种作用,代表正号,做加法运算,字符串的连接符
* b:整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型
* c:/获取的是除法操作的商,%获取的是除法操作的余数
* ++:(--同) ++在前在后的问题
 单独使用:++在前还是在后都不影响
 参与运算:a++  ++a
 ++在前,先+1,后运算
 ++在后,先运算,后 +1




10.面试题之变量相加和常量相加的区别
面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
* byte b1 = 3;
* byte b2 = 4;
* byte b3 = b1 + b2;
从两方面去回答这个题:
* byte类型的变量在进行运算的时候,会自动类型提升为int类型 
* b1和b2是两个变量,变量存储的值是变化,在编译的时候无法判断里面具体的值,相加有可能会超出byte的取值范围


11.ASCII码表的概述
* 记住三个值:
* '0'  48
* 'A'  65
* 'a'  97


12.逻辑运算符
&&和&的区别 如果左边为false 右边将不执行
||和|的区别 如果左边为true  右边将不执行
如果表达式左边能够判断整个表达式的结果,那么右边将不执行


13.位运算符
^的特点:一个数据对另一个数据位异或两次,该数本身不变。
<<:左移 左边最高位丢弃,右边补齐0
>>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1
>>>:无符号右移 无论最高位是0还是1,左边补齐0
左移几位就是乘以2的几次幂,右移几位就是除以2的几次幂


14.面试题:
* 请自己实现两个整数变量的交换
//需要第三方变量,开发推荐用这种
/*int temp;
temp = x;
x = y;
y = temp;*/
//不需要第三方变量,通过^来做
x = x ^ y; // 10 ^ 5 
y = x ^ y; // 10 ^ 5 ^ 5 y = 10
x = x ^ y; // 10 ^ 5 ^ 10  x = 5


15.三元运算符
格式:
(关系表达式) ? 表达式1 : 表达式2;
表达式 1&2 的位置不能是输出语句.


16.Scanner的使用
通过键盘录入int类型数据:
A:导包(导包代码必须放在java文件的第一行有效代码处)
import java.util.Scanner;
B:创建对象
Scanner sc = new Scanner(System.in);
C:调用方法,获取数据
 int number = sc.nextInt();


17.流程控制语句?几类?
能控制程序运行流程的语句,分:
顺序结构、选择结构(if 和 switch)、循环结构(for,while,do...while)


18.三元运算符实现的,都可以采用if语句实现。反之不成立。
* 什么时候if语句实现不能用三元改进呢?
* 当if语句控制的操作是一个输出语句的时候就不能。
* 为什么呢?因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。


19.swith格式:
switch(表达式) { //可用的类型 byte short int char String 枚举
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
default:
语句体n;
break;
}
注意事项:
a:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
b:case和default在书写上是没有先后顺序,但是执行上会先去找对应的case值,
c:case或default语句可省略break,但无break,程序就会顺序执行下来直到遇到一个break或}才结束。
e:default整体可以省略吗?
可以,但一般不省略,它相当于if的else语句


20.三种循环语句的区别
for的初始化值只执行一次离开循环体不能使用;
while的初始化语句在循环体外可重复使用
do...while循环语句至少执行一次,上两者要先判断条件为true才执行循环语句


21.控制跳转语句
break -- 只能用于switch和循环中,用于跳出循环
continue -- 只能用在循环中,用于跳出本次循环继续下次循环
return -- 用于结束方法,返回相应的数据


22.方法重载
在同一个类中,方法名相同,参数列表不同。与返回值类型无关。
参数列表不同:
* A:参数个数不同
* B:参数类型不同
* C:参数的顺序不同算重载


23.java中值传递问题:
基本数据类型:形参的改变不会影响实际参数,因为传递的是具体的数值
(String当做参数传递是符合基本类型的规则.)
引用数据类型:形参的改变会直接影响实际参数,因为传递的是地址值.


24.什么是面向对象?
基于面向过程而言,是一种符合人们思维习惯的编程思想.在程序中用对象映射现实中的事物,
使用对象的关系来描述事物间的关系,这种思想就是面向对象.
  特点:
* a:是一种更符合人们思想习惯的思想
* b:可以将复杂的事情简单化
* c:将程序员从执行者变成了指挥者
三大思想特征:
* 封装、继承、多态。


25. * 成员变量 就是事物的属性
* 成员方法 就是事物的行为
* 类:相关属性和行为的集合,它是一个抽象的概念
* 对象:就是类的具体实现


26.成员变量和局部变量的区别有哪些?
a、类中定义的位置
前者在类中方法外,后者在方法中
b、内存中的位置
前者在堆内存中(依托对象存在的,对象存在堆中)
后者在栈内存中(依托方法存在的,方法是在栈中)
c、生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的弹栈而消失
d、初始化值不同
成员变量:有默认初始化值.
局部变量:没有默认初始化值,使用之前必须先赋值,否则报错.


27. Java语言最基本的单位是:class
计算机能直接识别的进制是:二进制
计算机最小的存储和运算单位是:byte


28.什么是匿名对象?什么时候使用?
定义:没有名字的对象
使用:
当对象只使用一次的时候可以考虑使用匿名对象
匿名对象当做参数进行传递.(用的较多)


29.什么是封装?封装的好处,原则分别是什么?
指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
封装好处
* 隐藏实现细节,提供公共的访问方式
* 提高了代码的复用性
* 提高安全性。
封装原则
* 将不需要对外提供的内容都隐藏起来。
* 把属性隐藏,提供公共方法对其访问。


30.封装指的就是private,这句话对吗?
不对。private仅仅是封装的一种体现形式,不能说封装就是私有。
private关键字特点
a:是一个权限修饰符
b:可以修饰成员变量和成员方法
c:被其修饰的成员只能在本类中被访问


31.this是什么?
* this是关键字
* 代表当前对象的引用 ,谁调用就代表谁
* 用来区分成员变量与局部变量重名


32.构造方法的格式是什么?有哪些注意事项?
格式:
修饰符 方法名() {}
格式特点:
* a:方法名与类名相同(大小也要与类名一致)
* b:没有返回值类型,连void都没有
* c:没有具体的返回值,但有return,只是不用写;
注意事项:
* 如果没有给出构造方法,系统会默认给出无参构造
* 如果手动给出构造方法,那么系统将不再提供默认构造方法(推荐永远手动给出无参构造)
* 构造方法也存在重载,方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表.


33.给成员变量赋值有几种方式?有什么区别?
两种方式:
* 构造方法
* set()方法
区别:
set方法就是为了给成员变量赋值
构造方法主要是初始化对象


34.static关键字有什么特点,使用的时候有什么注意事项?
特点:
* a:随着类的加载而加载
* b:优先于对象存在
* c:被类的所有对象共享
* d:可以通过 类名. 的方式调用
注意事项:
* 静态方法中没有this关键字
* 静态方法只能访问静态方法及变量(静态只能访问静态)
* 非静态方法既可以访问静态也可以访问非静态
使用场景:
如果某个内容被该类下所有对象所共享时,用static修饰


35.静态变量和成员变量的区别是什么?
* A:所属不同
* 静态变量属于类,称为类变量
* 成员变量属于对象,称为实例变量(对象变量)
* B:内存中位置不同
* 静态变量存储于方法区的静态区
* 成员变量存储于堆内存
* C:内存出现时间不同
* 静态变量随着类的加载而加载,随着类的消失而消失
* 成员变量随着对象的创建而存在,随着对象的消失而消失
* D:调用不同
* 静态变量可以通过类名调用,也可以通过对象调用
* 成员变量只能通过对象名调用


36.代码块
分为局部代码块,构造代码块,静态代码块,同步代码块
* 局部代码块 
* 在方法中出现,限定变量生命周期,及早释放,提高内存利用率
* 构造代码块
* 在类中方法外出现,定义多个构造方法共性的内容,在构造方法前执行,提高代码复用性
* 静态代码块 
* 用于给类进行初始化,在类加载的时候执行,且只执行一次,一般用于加载驱动


37.子父类都有静态代码块、构造代码块、构造方法,那么他们六者之间的执行流程是什么?
a.父类静态代码块
b.子类静态代码块
c.父类构造代码块、构造方法
d.子类构造代码块、构造方法


38.继承?
好处: 
* 提高代码复用性和维护性
* 让类与类间产生关系,是多态的前提
弊端: 
* 类的耦合性增强
特点:
a:类与类间只支持单继承,不支持多继承。
b:类与类支持多层继承
注:java中,接口可以多继承,类与类之间单继承
注意事项:
a:子类只能继承父类所有非私有的成员(成员变量和方法)
b:子类不能继承父类的构造方法,但可通过super关键字访问父类构造方法。
c:不要为了部分功能而去继承
谁是谁的种类时使用


39.this关键字和super关键字分别代表什么,以及他们各自的作用分别是什么?
this:代表当前对象的引用
super:代表当前对象父类的引用
调用区别: 
a:调用成员变量
* this.成员变量 即可调用本类成员变量,也可调用父类成员变量
* super.成员变量 调用父类成员变量
b:调用构造方法
* this() 调用本类的构造方法
* super() 调用父类的构造方法
c:调用成员方法
* this.成员方法 即可调用本类方法,也可调用父类方法
* super.成员方法 调用父类成员方法


40.Overload和Override的区别是什么?方法重载能改变返回值类型吗?
重载:在同一类中,方法名相同,参数列表不同,与返回值类型无关
重写:在子父类中,方法声明完全相同,子类方法权限修饰符大于或等于父类方法权修
可以改变
当子类需要父类的功能,而其又有特有内容时,可重写父类方法
重写注意事项:
a:父类中私有方法不能被重写
b:子类重写父类方法时,访问权限不能更低
c:静态方法只能用静态方法重写


41.final关键字可以做什么,有什么特点?
修饰类,成员变量和方法
修饰类:类不能被继承
成员变量:变成了常量,只能被赋值一次
成员方法:不能被重写
   final修饰局部变量:
* 修饰基本类型,值不能被改变
* 修饰引用类型,地址值不能被改变,属性可改变


42.多态:是事物存在的多种形态
前提条件:
须有继承关系
须有方法重写
须有父类引用指向子类对象
成员访问的特点:
成员变量:编译与运行都看父类.
成员方法(非静态方法):编译看父类,运行看子类
静态方法:编译与运行都看父类.
好处:
提高代码的可维护性
提高了代码的扩展性(可当形式参数,接收任意子类对象)
弊端:
不能使用子类特有的成员


43.抽象类:被abstract修饰的类
特点:
抽象类和抽象方法必须用abstract关键字修饰
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
不能创建本类对象(不能被实例化),可通过多态创建
子类要么是抽象类,要么需重写抽象类的抽象方法
成员特点
成员变量:既可以是变量也可以是常量.abstract不能修饰成员变量
成员方法:既可以有抽象方法,也可以有非抽象方法.(可以无抽象方法)
构造方法:有构造方法.用于子类访问父类数据前,父类的初始化
* a:抽象方法 强制要求子类做的事情。
* b:非抽象方法 子类继承的事情,提高代码复用性。
抽象类的面试题:
A、一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,为了不让其他类创建本类对象,交给子类完成
B、abstract不能和哪些关键字共存,为什么?
static:抽象类无方法体,类名.调用毫无意义
final:抽象类方法需要子类重写,final修饰的方法不能重写,矛盾
private:私有是隐藏成员变量与方法不让其他类调用,抽象类需要子类重写


44.接口:
interface 关键字定义的,对外提供规则的都是接口
特点:
a:接口用关键字interface表示
* interface 接口名 {}
b:类实现接口用implements表示
* class 类名 implements 接口名 {}
c:接口不能实例化,需通过多态的方式实例化
d:接口的子类要么是抽象类,要么重写接口中的所有抽象方法
成员特点:
成员变量:只能是常量 默认修饰符public static final
成员方法:只能是抽象方法 public abstract
构造方法:无,不需要初始化


45.抽象类和接口的区别
* A:成员区别
* 抽象类:
* 成员变量:可以变量,也可以常量
* 构造方法:有
* 成员方法:可以抽象,也可以非抽象
* 接口:
* 成员变量:只可以常量
* 成员方法:只可以抽象
* B:关系区别
* 类与类
* 继承,单继承,可多层继承。
* 类与接口
* 实现,单实现,多实现,可在继承一个类的同时实现多个接口
* 接口与接口
* 继承,单继承,多继承
* C:设计理念区别
* 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
* 接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。 
* 对事物本质的抽象用抽象类,对事物功能的扩展用接口


46.修饰符:
* 权限修饰符:private,默认的,protected,public
* 状态修饰符:static,final
* 抽象修饰符:abstract
成员变量 成员方法 构造方法
private N              Y               Y               Y
默认 Y              Y               Y               Y
protected N              Y               Y               Y      
public Y              Y               Y               Y
abstract Y              N               Y               N
static N            Y Y N
final Y              Y               Y N


47.内部类的访问特点是什么?
* 可直接访问外部类成员,包括私有。
* 外部访问内部成员,须创建对象。
* 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
* 内部类被静态修饰后的访问方式: 外部类名.内部类名 对象名 = 外部类名.内部类对象;


48.局部内部类访问局部变量,该局部变量必须用哪个关键字修饰,为什么?
用final修饰
局部变量生命周期和方法一样,方法弹栈会跟随消失,而局部内部类还存在
用final修饰在类加载时进入常量池,即使方法弹栈,常量池的常量还在,可继续使用
jdk1.8改为了默认用final修饰


49.匿名内部类
* 就是内部类的简化写法。可以是具体类也可以是抽象类。
* 本质:是一个继承了该类或实现该接口的子类匿名对象。
* 前提:存在一个类或者接口.


50.集成开发环境 IDE (如Eclipse,Editplus)
* (Integrated Development Environment)


51.简述==和equals的区别?
== 既可以比较基本数据类型(值),又可以比较引用数据类型(地址值).
equals 只能比较引用数据类型,其默认比较地址值无意义,所以需要重写其方法比较对象属性


52.StringBuffer和String的区别
* String是一个不可变的字符序列
* StringBuffer是一个可变的字符序列 


53.StringBuffer和String的相互转换
* A:String -- StringBuffer
* a:通过构造方法
* b:通过append()方法
* B:StringBuffer -- String
* a:通过构造方法
* b:通过toString()方法
* c:通过subString(0,length);


54.面试题
* String,StringBuffer,StringBuilder的区别
* StringBuffer和StringBuilder的区别
* StringBuffer是jdk1.0版本的,是线程安全的,效率低
* StringBuilder是jdk1.5版本的,是线程不安全的,效率高
* String和StringBuffer,StringBuilder的区别
* String是一个不可变的字符序列
* StringBuffer,StringBuilder是可变的字符序列


55.String和int类型的相互转换
* A:int -- String
* a:和""进行拼接
* b:public static String valueOf(int i)
* c:int -- Integer -- String(Integer类的toString方法())
* d:public static String toString(int i)(Integer类的静态方法)
* B:String -- int
* a:String -- Integer -- int
* public static int parseInt(String s)


56.JDK5的新特性
* 自动装箱:把基本类型转换为包装类类型
* 自动拆箱:把包装类类型转换为基本类型
        
57.数组和集合的区别?
数组:
1 长度不可变
2 既可以存储基本类型,也可以存储引用类型
3 一个数组中只能存储同种数据类型的元素
集合:
1 长度可变
2 只能存储引用数据类型
3 同一集合可以存储不同类型的元素


58.集合体系
Collection 
List(存取有序,有索引,可重复)
ArrayList   
LinkedList
Vector
Set(存取无序,无索引,唯一)
HashSet
TreeSet


59.获取数组,字符串,集合的长度怎么获取?
数组:.lenght属性
字符串:lenght() 方法
集合:size()


60.怎样解决并发修改异常?
1 使用List 接口中特有的迭代器 ListIterator 去遍历
2 使用size()和get()方法结合的方式去遍历.


61.List的三个子类的特点
ArrayList:
底层数据结构是数组,查询快修改快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
Vector相对ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构)
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。


Vector和ArrayList的区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的


ArrayList和LinkedList的区别
ArrayList底层是数组结构,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的


62.集合框架(栈和队列数据结构).
栈:先进后出
队列:先进先出


63.泛型概述:限定集合存储的数据类型.
* B:泛型好处
* 提高安全性(将运行期的错误转换到编译期) 
* 省去强转的麻烦
* C:泛型基本使用
* <>中放的必须是引用数据类型 
* D:泛型使用注意事项
* 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)  


64.集合框架(三种迭代的能否删除).
普通for:可以删除,但是删除元素后索引要--
迭代器:可以删除,删除时要使用迭代器的删除方法.
增强for:不能删除


65. 集合转数组:toArray() 
数组转集合:Array.asList() 


66.Map接口和Collection接口有什么不同? Set底层依赖的是Map
Map:是双列集合,键唯一,值可以重复
Collection :是单列集合,它的子接口Set元素唯一,List 元素可重复.


67.面试题
* HashMap和Hashtable的区别
* Hashtable是JDK1.0版本出现的,是线程安全的,效率低
* HashMap是JDK1.2版本出现的,是线程不安全的,效率高
* Hashtable不可以存储null键和null值,HashMap可以存储null键和null值


68.Treeset和Treemap 集合的排序:
两种排序方式:自然排序和比较器排序.
让自定义对象所属类去实现Comparable接口并重写compareTo()方法
用集合的带参构造,接收Comparator接口子类对象


69.异常:
RuntimeException  运行时异常
非  RuntimeException  编译时期异常 (我们处理的都是编译时期异常)


70.throws和throw的区别  
* a:throws
* 用在方法声明后面,跟的是异常类名  
* 可以跟多个异常类名,用逗号隔开   
* 表示抛出异常,由该方法的调用者来处理 
* b:throw
* 用在方法体内,跟的是异常对象名
* 只能抛出一个异常对象名
* 表示抛出异常,由方法体内的语句处理


71.如果没有finally,后面的代码也会执行,那么finally有和没有的区别是什么?
(假设finally一定会执行的正常情况下)
答: 如果有必需要执行的程序,放在finally中就一定会执行。
但是如果不放在finally中,假设这个时候try块中出现的异常是没有被捕获到的,
那么程序就会死掉,从而导致必须要执行的代码没有被执行到!


72.面试题:final,finally和finalize的区别
final 
是个关键字
它修饰的类不能被继承
它修饰的方法不能不重写
它修饰的变量就变成了常量
finally 
是一个关键字,是异常处理的一部分
一般用在捕获异常时,它里面的代码永远会被执行
(特殊情况在执行到finall之前就退出了虚拟机)
finalize() 
是Object类中垃圾回收的方法


73.假如在catch里面有return语句,请问finally里面的代码还会执行吗?如果执行,是在return前,还是return后?
会执行。在return前执行。
准确答案:在return之间执行。


74.异常的注意事项及如何使用异常处理
a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
b:如果父类抛出了多个异常,子类只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
父类不抛异常子类也不能抛,必须捕获处理,父类的异常要包含子类的.


75.flush和close方法的区别?
flush只刷新缓冲区,刷新之后流对象还可以继续使用
close是先刷新缓冲区,再关闭流对象,流对象不能继续使用


76.如何选流
如果是非文本文件:只能选择字节流
如果是纯文本文件:如果操作文件既要读,也要写,中间没有任何其他操作选择字节流
如果只读,或只写,那么就选择字符流.
如何确定文件是否是纯文本文件?
使用记事本打开能够读懂就是纯文本文件
反之不是


77.递归的使用
1 找出口
2 确定返回值类型
3 确定参数列列表


78.装饰设计模式
定义:起始就是把原有的对象进行包装,具备了更多的功能
装饰设计模式的好处:降低耦合性,被装饰的类改变,不会影响装饰类


79.内存输出流:
该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
细节:内存输出流是不需要指定路径,因为它是直接向内存中写数据
注意:内存输出流是不需要关闭的,因为它不是直接向硬盘中写数据.


80.打印流想要使用自动刷新?
1 创建打印流对象时,使用两个参数的构造,并且用true标记启动自动刷新
2 想要自动刷新只能使用println()方法,print()方法是不能自动刷新的.
注意:打印流只操作目的地不操作数据源(打印流只有输出流)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值