1.java跨平台原理:
java源程序(.java文件)要先编译成与平台无关的字节码文件(.class),然后字节码文件(.class)在通过java虚拟机解释成机器码。只要平台安装有虚拟机,则可以运行字节码文件,所以说java是跨平台的,具有一次编译,到处运行的特点。
2.java三大版本
java2平台包含标准版(J2SE)、企业版(J2EE)、微缩版(J2ME)三个版本
他们的范围是:J2SE包含于J2EE,J2ME包含了J2SE的核心类,但新添加了一些专有类应用场合,API的覆盖范围各不相同。
3.什么是JVM?什么是JDK?什么是JRE?
(根据英文缩写记)
jvm(Java Virtual Machine):java虚拟机,可以执行.class文件
jre(java runtime environment):java运行环境,是java程序的运行时环境,包含JVM和运行时所需要的核心类库。
jdk(是java development kit):java开发工具包,包含JRE和开发人员使用的工具
jvm,jre,jdk关系图解:
4.8中基本数据类型及其字节数
关键字 字节数
byte 1
short 2
int 4
long 8
float 4
double 8
boolean 1(位)
char 2
5.i++和++i的异同之处
i++ : 用i原本的值计算,之后i+1(先计算后加1)
++i : 用i+1之后的值计算(先加1后计算)
6.用最有效率的方法算出2乘以8等于多少
使用位运算来实现效率最高。
对于位运算符“<<”, 是将一个数左移n位,就相当于乘以了2的n次方
7. break和continue的作用
break:结束当前循环并退出当前循环体。break还可以退出switch语句
continue:结束本次循环,继续进行循环条件的判断,成功则进入下一次循环
8.冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个,则最大的会被排到最后,针对所有的元素重复以上的步骤,除了最后一个,直到没有任何一对数字需要比较。
代码:
public int[] sort(int[] array) {
int temp = 0;
// 外层循环,它决定一共走几趟 //-1为了防止溢出
for (int i = 0; i < array.length - 1; i++) {
int flag = 0; //通过符号位可以减少无谓的比较,如果已经有序了,就退出循环
//内层循环,它决定每趟走一次
for (int j = 0; j < array.length - i - 1; j++) {
//如果后一个大于前一个,则换位
if (array[j + 1] > array[j]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp; flag = 1;
}
}
if(flag == 0){
break;
}
}
return array;
}
9.选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
10.类和对象的关系
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,对象是具体的,占用存储空间。
比如人类就是一个概念,人类具有身高,体重等属性。人类可以做吃饭、说话等方法。
小明就是一个具体的人,也就是实例,他的属性是具体的身高200cm,体重180kg,他做的方法是具体的吃了一碗白米饭,说了“12345”这样一句话。
11.方法重载和方法重写的区别
方法重载是在一个类中,为一种行为提供多种实现,与修饰符、返回值、方法名、参数无关。
方法重写发生在子类和父类之间,父类方法无法满足子类的要求,子类通过方法重写满足要求。
12.this和super关键字的作用
this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题,this可以调用成员变量,不能调用局部变量,构造方法中不允许省略this,静态方法中不允许出现this关键字。
super代表对当前对象的直接父类对象的引用,super可以调用直接父类的成员变量、成员方法,super可以调用直接父类的构造方法,只限在构造方法中使用,且必须是第一条语句。
13.static关键字的作用
static可以修饰变量,方法,代码块,内部类
内存中的位置:静态存储区,在整个程序运行期间一直存在
1.具有隐藏的作用
2.保持变量内容的持久
3.默认初始化为0
调用方法:类名.属性(方法)
14.final和abstract关键字的作用
final用来修饰类、方法、属性,不能修饰构造方法,使用final修饰的类不能被继承,使用final修饰的方法不能被重写,使用final修饰的变量的值不能被修改,所以就成了常量。
abstract可以修饰类和方法,不能用来修饰属性和构造方法,使用abstract修饰的类是抽象类,需要被继承,使用abstract修饰的方法是抽象方法,需要子类被重写。
15.final、finally、finalize的区别
final可以修饰类,方法,属性,使用final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量不能被改变。
finally:在异常处理时提供finally来执行清除操作,如果有finally的话,不管是否发生异常,finally语句都会被执行。
finalize:finalize是方法名,是在垃圾收集器删除对象之前调用的,用来做必要的清理工作。它是在object类中定义的,所有的类都继承了它。一般情况下,此方法由JVM调用。
16.写出java.lang.Object类的6个常用方法
1.toString():把数据转变成字符串
2.hashCode():获取哈希码
3.getClass():获取类结构信息
4.wait():多线程中等待功能
5.clone():克隆
6.notify():多线程中唤醒功能
7.notifyAll():多线程中唤醒所有等待线程的功能
17.==和equals的区别和联系
“==”是关系运算符,equals()是方法,结果都返回布尔值
“= =”
对于基本类型,比较的是值
引用类型,比较的是地址
用户自定义的类如果没有覆盖equals(),将调用父类的equals(比如是Object),而Object的equals比较的是地址,和= =作用相同。
18.实现多态的三个条件
1.继承的存在
2.子类重写父类的方法
3.父类引用变量指向子类对象
19.简述java的垃圾回收机制
java语言不需要程序员直接控制内存回收,是有jre在后台自动回收不再使用的内存,成为垃圾回收机制,简称GC。
程序员可以通过System.gc()或Runtime.getRuntime().gc()来通知系统进行垃圾回收,但是否回收不确定。
20.面向对象的三大特征
封装、继承、多态
21.什么是Java的序列化,如何实现Java的序列化?
java序列化就是将一个实例对象的状态信息写入到一个字节流中使其可以通过socket进行传输、或者持久化到存储数据库或文件系统中。
实现序列化只需实现java.io.serializable接口
22.java创建对象的几种方式
1.用new语句创建对象,这是最常见的创建对象的方法
2.运用反射的手段,调用java.lang.Class或java.lang.reflect.Constructor类的newInstance()实例方法。
3.调用对象的clone()方法
4.运用反序列化的手段,调用java.io.ObjectInputStream对象的readObject()方法
23.匿名内部类可不可以继承或实现接口?
匿名内部类是没有名字的内部类,不能继承其他类,但一个内部类可以作为一个接口,由另一个内部类实现。
24.接口和抽象类的区别
注:抽象方法不写方法体
接口:接口中所有方法都是抽象方法(默认,不写abstract),接口只是定义了一种规范,由实现类完成“怎么做”,接口不能实例化,一个类可以实现多个接口,使用implements。
抽象类:抽象类体现了一种继承关系,目的是复用代码,抽象类中可以有0,1或多个抽象方法,与普通类的区别是抽象类不能实例化且允许有abstract方法,一个类只能继承一个抽象类,使用extends。
25.同步代码块和同步方法有什么区别
同步方法就是在方法前面加关键字synchronized,被同步的方法一次只能有一个线程进入,其他线程等待。而同步代码块则是在方法内部使用大括号使得一个代码块得到同步。同步代码块会有一个同步的目标,使得同步块更加灵活一些。一般情况下,如果此目标为this,那么同步方法和同步代码块没有太大的区别。同步方法锁的范围比较大,性能就比较差,一般需要加锁进行同步的时候,范围越小越好,这样性能更好。
26.静态内部类和内部类有什么区别
1.静态内部类不需要有指向外部类的引用,但非静态内部类需要持有对外部类的引用。
2.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)
3.非静态内部类能够访问外部类的静态和非静态成员,静态内部类只能访问外部类的静态成员
实例化方式不同:
1.静态内部类不依赖于外部类的实例,直接实例化内部类对象(是真的类)
2.非静态内部类:通过外部类的对象实例生成内部类对象(是在对象中new出来的类)
27.反射的概念和作用
反射的概念:反射是一种计算机处理方式,是程序可以访问、检测和修改本身状态或行为的一种能力。
反射的作用:程序在运行状态中,可以动态加载一个只有名称的类,对于一个已经加载的类,能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意属性和方法。
反射的优点:增加程序的灵活性,很多框架用到了反射技术,比如jdbc,spring。
28.Integer和int有什么区别?
int默认值为0,Integer默认值为null,即Integer可以区分出未赋值和值为0的情况。
Integer还提供了多个与整数相关的操作方法,比如parseInt
29.如何实现克隆
1.实现Cloneable接口并重写Object类中的clone()方法
2.实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆