1.面向对象的特征有哪些
封装:是指将数据和他的数据处理过程包装起来,隐藏类的内部细节
继承:新创建的类继承现有类的成员属性和方法,提高代码复用和扩展性
多态:两个特征向上造型和向下转型,一个将父类型的对象指向子类型的引用,另一个将父类型的引用强转为子类型的引用
2.访问修饰符有哪些,他们有什么区别
private 只有本类
default 只有同包类
protected 只有同包类及其他包子类可使用
public 在所有类均可使用
3.float f = 3.4; 是否正确?
float f=3.4f;
4.short s1 = 1; s1 = s1 + 1;有错码? short s1 = 1; s1+=1;有错吗?
前者有错改成 s1= (short)(s1+1)等同于后者
5.Java有没有goto?
保留关键字
goto
const
6.&和&&的区别
逻辑运算短路与 &&
&表达两种意思
一种是运算&
一种是按位&
a7.解释内存中栈(stack)、堆(heap)和方法区(method area)的用法
栈stack中存入变量名 变量地址 变量类型
堆heap中存入变量值
方法区存入类 的 字节码文件 , 静态方法 ,静态变量
在Java虚拟机(JVM)内存中,栈(stack)、堆(heap)和方法区(method area)是不同的内存区域,用于存储不同类型的数据和执行程序的相关信息。
栈(stack):
栈用于存储线程执行方法时的局部变量、方法调用和方法返回的信息。
每个线程都有自己的栈,当线程启动时,会创建一个初始的栈帧(stack frame),随着方法的调用和返回,栈帧会被依次压入和弹出。
栈的大小和生命周期都是由编译器或虚拟机进行管理的,通常比较小。
栈的分配和释放是自动进行的,不需要手动管理。
堆(heap):
堆是用于存储对象实例和数组的区域。
所有通过
new
关键字创建的对象都存储在堆中。堆的大小和生命周期是动态的,由垃圾回收器(garbage collector)进行管理。
堆的分配和释放是相对较慢的,但可以存储大量的数据。
方法区(method area):
方法区用于存储类的信息、静态变量、常量池、方法字节码等数据。
方法区是所有线程共享的,存储的是类的结构信息,不存储对象的实例数据。
方法区的大小和生命周期是由虚拟机进行管理的,可以进行调整。
8.switch是否能作用在byte上,能否作用在long上,能否作用在String上?
byte short int char String
不能作用float long boolean
9.用zuiyouxiaolv的方法计算2乘以8
System.out.print(2<<3);
10.在Java中,如何跳出当前的多重嵌套循环
OUT:
循环体
break OUT;
while(true){
if( n ==1){
return 1;}
f(n) = f(n-1)+f(n-2);}
11.构造器是否可以被重写?
不可以,构造器不能被继承,父子类不存在同一构造方法来进行方法覆盖重写
12.重写和重载的区别,重载的能法能否根据返回值类型进行区分?
重写☞方法签名一致只有方法体不同 是父子类中的。
重载☞方法签名不一致其他都一样 是一个类当中的特殊方法 没有返回值 ,方法名是类名,
只要满足以上条件就一定是重载方法。
13.【华为面试题】为什么不能根据返回类型来区分重载?
重载目的是为了创建实例对象,不能返回给未创建对象数据类型。
重载的定义是其他都相同,只有方法签名不同,返回类型就毫无意义区分。
14.阐述静态变量和实例变量的区别
静态变量有默认值,不可以被改变;
实例变量是创建出来的变量,可以改变类型 ,值 ,地址
15.一个“.java”源文件中是否可以包含多个类?有什么限制
只有一个public类 并且public修饰的类名与java文件名一致
其他类可以有多个 内部类可以有多个public
16.用Java写一个折半查找
二分查找
arr[ 9 ] = { 1,3,4,5,2,6,9,7,8};
int number = arr.length;
for ( int i = 0 , i < arr .length , i++){
int a = arr[ number/2 ]
if ( arr[i] > a ){
arr[ number/2 ] = arr [i ];
arr [ i ] = a;
}
17.阐述静态变量和实例变量的区别
18.描述一下JVM加载class文件的原理机制
JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的, Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性经过编译的Java源程序,并不是一个可执行程序,而是一个或多个类文件,当Java程序需要使用某个类时JVM会确保这个类已经被加载、连接(验证,准备和解析),和初始化。类的加载就是指把.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象,加载完成后Class对象还不完整,所以此时的类还不可用,当类被加载后就进入连接阶段,这一阶段包括验证,准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:
如果没存在直接的父类,并且这个类还没有被初始化,那么就先初始化父类。
如果类中存在初始化语句,就依次执行这些初始化语句
类的加载是由类加载器完成的类加载器,包括:根加载器(BootStrap)、扩展加载器(Extension),系统加载器(System)和用户自定义类的加载器(java.lang.ClassLoader的子类)。
从Java1.2 开始类加载过程,采取了父亲委托机制(PDM),PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器,类的加载,首先请求父类加载器加载,父类加载器无能为力时,才由其子类加载器自行加载,JVM不会像Java程序提供对Bootstrap的引用,下面是关于几个类加载器的说明:
Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar)。
Extension:从java.ext.dirs系统属性所指定的目录中加载类库。他的父加载器是Bootstrap;
System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器,它从环境变量classpath或者系统属性java.class.path 所指定的目录中加载类,是用户自定义加载器的默认父加载器。